排序含重复浮点值的OrderedDict时出现重复键名的问题
问题:排序OrderedDict时出现重复姓名
我有一个名为dict的OrderedDict,存储学生姓名和浮点类型的平均值,想要把排序后的平均值及对应姓名存入文件,但循环查找键时输出出现了重复的姓名。
原代码
print(dict) sorted_list = sorted(dict.values() , key = float) sorted_dict = list() for i in sorted_list: for j in dict: if dict[j] == i: sorted_dict.append([j,dict[j]]) break print(sorted_dict)
输出结果
OrderedDict([('mandana', '5'), ('hamid', '6.066666666666666'), ('sina', '11.285714285714286'), ('sara', '9.75'), ('soheila', '7.833333333333333'), ('ali', '5'), ('sarvin', '11.375')]) [['mandana', '5'], ['mandana', '5'], ['hamid', '6.066666666666666'], ['soheila', '7.833333333333333'], ['sara', '9.75'], ['sina', '11.285714285714286'], ['sarvin', '11.375']]
问题原因
字典里存在相同的平均值(mandana和ali的分数都是5),你先对values()排序得到包含两个5的列表。内层循环每次遇到5时,都会找到第一个匹配的键mandana就break,导致第二个5仍然匹配到mandana,ali完全被忽略,最终出现重复的mandana。
解决方案
直接对OrderedDict的items()进行排序,不需要单独排序values再反向查找键,既高效又能保留所有键值对:
from collections import OrderedDict # 示例OrderedDict定义 student_dict = OrderedDict([ ('mandana', '5'), ('hamid', '6.066666666666666'), ('sina', '11.285714285714286'), ('sara', '9.75'), ('soheila', '7.833333333333333'), ('ali', '5'), ('sarvin', '11.375') ]) # 按分数的浮点值排序键值对 sorted_students = sorted(student_dict.items(), key=lambda x: float(x[1])) print(sorted_students)
正确输出结果
[('mandana', '5'), ('ali', '5'), ('hamid', '6.066666666666666'), ('soheila', '7.833333333333333'), ('sara', '9.75'), ('sina', '11.285714285714286'), ('sarvin', '11.375')]
处理后可以直接将sorted_students写入文件,不会出现重复或遗漏的学生信息。
内容的提问来源于stack exchange,提问作者Sapoora Alavi
相关产品推荐
相关产品推荐

