首页 > 解决方案 > 从文本文件冒泡排序

问题描述

我有一个包含名字、姓氏和地址的 .txt 文件。我想使用冒泡排序按姓氏字母顺序排列列表。我知道该怎么做,但我最终迷路了。

Dayn,Overton,45 Ashton Way
Fanny,York,71 Luck Ln.
Maxine,Pierson,876 Kiwi St.
Candi,Robertson,25 Lake View
Dex,Brooks,94 Sunny Cir.
first = []
last = []
address = []

first = []
last = []
address = []

f = open('/Users/calebcalter/Desktop/sorting.txt', 'r')
last_sort = f.read()

print(last_sort)

length = len(last_sort)

for i in range(length):
    for o in range(length-1):
        if last_sort[o] > last_sort[o+1]:
            last_sort[o], last_sort[o+1] = last_sort[o+1], last_sort[o]
            print(last_sort)

标签: pythonbubble-sort

解决方案


程序中有一个严重错误,您正在使用f.read()它以字符串形式读取整个文件,从这里开始任何事情都没有任何意义
要将其读取为字符串列表(其中每个字符串是一行),请使用f.readlines()(查看[Python 3]:文件对象的方法以获取更多详细信息)。

然后,您将比较整个字符串(因此您的排序主要针对每个字符串的第一个部分的名字)。要对姓氏(即第二部分)进行排序,您必须:

  • 在 " , "上拆分每个字符串(以获取其部分)
  • 第二部分(索引1)上进行比较,这是姓氏

最后,您的外部循环是一个for(涉及固定数量(N)的步骤):

  • 我没有花时间思考它是否足以满足任何列表(为了执行所有交换,列表需要遍历的最大次数是多少)。无论如何,如果不是,您最终可能会得到未排序的列表
  • 另一端:如果只需要交换列表中的最后 2 个值(因此,遍历列表一次就足够了),你仍然遍历它N
  • 考虑到上述情况,我切换到while遍历列表,直到最后一次遍历没有执行任何交换(意味着它已经排序)

下面只是从您的代码中提取(和修改)的排序部分。请注意,因为所有内容仅用于演示目的:

  • 没有错误检查
  • 有一些方法可以提高性能,但它们超出了当前范围

代码.py

#!/usr/bin/env python3

import sys


def last_name_bubble(records):
    length = len(records)
    done = False
    while not done:
        done = True
        for i in range(length - 1):
            #if records[i] > records[i + 1]:  # This is your original condition
            if records[i].split(",")[1].strip() > records[i + 1].split(",")[1].strip():
                records[i], records[i + 1] = records[i + 1], records[i]
                done = False
                #print(records)


def main():
    person_list = [
        "Dayn,Overton,45 Ashton Way",
        "Fanny,York,71 Luck Ln.",
        "Maxine,Pierson,876 Kiwi St.",
        "Candi,Robertson,25 Lake View",
        "Dex,Brooks,94 Sunny Cir.",
    ]
    print(person_list)
    last_name_bubble(person_list)
    print(person_list)


if __name__ == "__main__":
    print("Python {:s} on {:s}\n".format(sys.version, sys.platform))
    main()

输出

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q054769022]> "e:\Work\Dev\VEnvs\py_064_03.06.08_test0\Scripts\python.exe" code.py
Python 3.6.8 (tags/v3.6.8:3c6b436a57, Dec 24 2018, 00:16:47) [MSC v.1916 64 bit (AMD64)] on win32

['Dayn,Overton,45 Ashton Way', 'Fanny,York,71 Luck Ln.', 'Maxine,Pierson,876 Kiwi St.', 'Candi,Robertson,25 Lake View', 'Dex,Brooks,94 Sunny Cir.']
['Dex,Brooks,94 Sunny Cir.', 'Dayn,Overton,45 Ashton Way', 'Maxine,Pierson,876 Kiwi St.', 'Candi,Robertson,25 Lake View', 'Fanny,York,71 Luck Ln.']

推荐阅读