从文本文件冒泡排序

问题描述 投票:0回答:1

我有一个带有名字,姓氏和地址的.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)
python bubble-sort
1个回答
0
投票

程序中存在一个严重的错误,你正在使用f.read(),它以字符串形式读取整个文件,从这里任何事情都没有任何意义。 要将其作为字符串列表(每个字符串是一行)读取,请使用f.readlines()(有关详细信息,请查看[Python 3]: Methods of File Objects)。

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

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

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

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

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

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

code.朋友:

#!/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.']
© www.soinside.com 2019 - 2024. All rights reserved.