我目前正在做作业;但是,我得到了一些让我很困惑的有趣输出。
我正在尝试对以下字典进行排序:
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']
我的结果 词典是否有问题,或者我有什么遗漏?
答案 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]