Python 3字典排序错误的输出

时间:2017-03-29 02:18:57

标签: python sorting dictionary

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

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

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']

我的结果 词典是否有问题,或者我有什么遗漏?

4 个答案:

答案 0 :(得分:0)

字符串将以词法排序。要以数字方式对数据进行排序,请先将值转换为整数。

答案 1 :(得分:0)

由于字典的值是字符串,因此根据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']

答案 2 :(得分:0)

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

此外,对已经返回列表的内容使用列表解析也是多余的。

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

答案 3 :(得分:0)

你可以试试这个:

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]