繁体   English   中英

Python 3字典以错误的输出排序

[英]Python 3 Dictionary sorted with wrong output

我目前正在做作业; 但是,我得到了一些有趣的输出,这让我非常困惑。

我正在尝试对以下字典进行排序:

result = {'A1': '9', 'A2': '14', 'A3': '16', 'A4': '0', 'B1': '53', 'B2': '267', 'B3': '75', 'B4': '22', 'C1': '19', 'C2': '407', 'C3': '171', 'C4': '56', 'C5': '10', 'D3': '47', 'D4': '34', 'D5': '10'}

我使用Python 3的排序代码如下:(仅按值排序)

sortedList = [v for v in sorted(result.values())]

输出为:

['0', '10', '10', '14', '16', '171', '19', '22', '267', '34', '407', '47', '53', '56', '75', '9']

尚未完全排序。 输出是很奇怪的。

为什么会这样发生? 我使用了另一个字典来进行如下测试:

testD = {'A':'5','B': '9','c': '8','d': '6'}

输出是正确的:

['5', '6', '8', '9']

我的结果 字典有什么问题吗?还是我缺少了什么?

字符串将按词法排序。 要对数据进行数字排序,请先将这些值转换为整数。

由于字典的值是字符串,因此存在基于ascii值的词汇排序

显而易见,您需要根据值对其整数值进行排序。

result = {'A1': '9', 'A2': '14', 'A3': '16', 'A4': '0', 'B1': '53', 'B2': '267', 'B3': '75', 'B4': '22', 'C1': '19', 'C2': '407', 'C3': '171', 'C4': '56', 'C5': '10', 'D3': '47', 'D4': '34', 'D5': '10'}

如@AChampion的注释中所述,您可以通过使用类似以下的key来传递排序值类型:

sortedList = sorted(result.values(), key = int)
print(sortedList)

或者,您可以执行以下操作:

result_ints = dict((k,int(v)) for k,v in result.items())
sortedList = [str(v) for v in sorted(result_ints.values())]
print(sortedList)

上面的两个代码段都将导致:

['0', '9', '10', '10', '14', '16', '19', '22', '34', '47', '53', '56', '75', '171', '267', '407']

字符串一次只比较一个字符,所以'30' < '4'因为'3' < '4' 您需要使用key参数来基于数字值而不是字符串字符进行比较。

同样,在已经返回列表的对象上使用列表理解也是多余的。

sortedList = sorted(result.values(), key=int)

您可以尝试以下方法:

result = [{'A1': '9', 'A2': '14', 'A3': '16', 'A4': '0', 'B1': '53', 'B2': '267', 'B3': '75', 'B4': '22', 'C1': '19', 'C2': '407', 'C3': '171', 'C4': '56', 'C5': '10', 'D3': '47', 'D4': '34', 'D5': '10'}]

lst=[] 

for item in result:
    for key in item.keys():
        lst.append(int(item.get(key)))        

sortedList = [v for v in sorted(lst)]
print(sortedList)

输出:[0、9、10、10、14、16、19、22、34、47、53、56、75、171、267、407]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM