python - 从文本文件冒泡排序
问题描述
我有一个包含名字、姓氏和地址的 .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)
解决方案
程序中有一个严重错误,您正在使用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.']
推荐阅读
- sql - 关键字“ON”附近的语法不正确 - 尝试将子数据添加到现有行
- python - 如何在 Notebook 小部件 tkinter 中将选项卡(带文本)旋转 90°?
- python - 使用多个异步程序时的 aiomysql 行锁定
- python-3.x - 连续函数乘以离散函数时如何使用scipy积分
- python - For Loop 有 2 个变量,但只想枚举其中 1 个
- python - 以特定格式打印键值对
- java - JVM 原生方法栈架构
- sql-server - 迁移到新的 SQL Server 后,在 MS Access 中更新链接表的最佳方法是什么?
- node.js - 如何定义 Typescript 接口,其中一个属性是变量属性名称处的数组值?
- latex - 在 Anki 中使用 LaTeX 时的小字体