求助:使用Bubble Sort对TXT文件数据按姓氏字母排序
解决按姓氏冒泡排序的问题
我来帮你搞定这个问题!你的代码目前的核心问题是没有正确解析文件里的每行数据,反而把整个文件内容当成一个字符串来对单个字符排序,这完全偏离了按姓氏排序的目标。咱们一步步来修正:
你的代码存在的问题
- 重复定义了
first、last、address列表,属于冗余代码,没有实际作用 - 使用
f.read()把整个文件读成一个字符串,后续的排序操作只是在对字符串的单个字符做比较交换,完全不是按行按姓氏排序 - 没有将每行数据拆分成对应的名字、姓氏、地址字段,无法针对姓氏进行排序逻辑处理
正确的实现步骤与代码
我们需要先把文件里的每行数据解析成包含名字、姓氏、地址的结构化数据,再用冒泡排序基于姓氏的字母顺序对这些数据行排序。
# 初始化列表存储所有人员数据 people = [] # 读取文件并解析每行数据 with open('/Users/calebcalter/Desktop/sorting.txt', 'r') as f: # 逐行读取文件 for line in f: # 去掉每行末尾的换行符,然后按逗号分割成三个字段 # strip()处理可能的首尾空格,split(',')分割时保留字段内的空格(比如地址里的空格) first_name, last_name, address = line.strip().split(',') # 将解析后的数据添加到列表中,把姓氏放在第一个位置,方便排序时直接比较 people.append( (last_name.strip(), first_name.strip(), address.strip()) ) # 实现冒泡排序:按姓氏的字母顺序排序 n = len(people) for i in range(n): # 标记是否发生交换,无交换说明已排序完成,可提前结束 swapped = False # 每次遍历到未排序的最后一个元素前 for j in range(0, n-i-1): # 比较当前元素和下一个元素的姓氏 if people[j][0] > people[j+1][0]: # 交换两个元素的位置 people[j], people[j+1] = people[j+1], people[j] swapped = True # 本轮无交换则跳出循环,优化排序效率 if not swapped: break # 输出排序后的结果 print("按姓氏字母排序后的列表:") for person in people: # 按原格式输出:名字,姓氏,地址 print(f"{person[1]},{person[0]},{person[2]}") # 可选:将排序后的结果写回新文件 with open('/Users/calebcalter/Desktop/sorted_sorting.txt', 'w') as f: for person in people: f.write(f"{person[1]},{person[0]},{person[2]}\n")
代码说明
- 文件解析:用
with语句安全打开文件,逐行读取并拆分字段,同时清理字段前后的多余空格 - 数据存储:把每行数据存为元组,将姓氏放在首位,方便排序时直接索引比较
- 冒泡排序优化:加入
swapped标记,提前终止已有序的循环,提升运行效率 - 结果输出:按原数据格式打印排序后的内容,也可以选择写入新文件保存结果
用你提供的示例数据测试,运行后会得到按姓氏字母顺序排序的结果:
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.
内容的提问来源于stack exchange,提问作者CalebCal
相关产品推荐
相关产品推荐

