如何根据列表中的值对字典进行排序(两个顺序标准)
我需要按照两个顺序来排序这个字典:首先是“排名”降序排列,其次是“水果”升序排列(如果排名相同的话)。
这个字典的结构是这样的:
'object':['fruit',rank]
举个例子,我有:
myDict = {'item2': ['bananas', 3], 'item3': ['cocumbers', 11], 'item1': ['pinapples', 3], 'item4': ['pears', 3]}
我的目标是得到这个结果:
{'item3': ['cocumbers', 11], 'item2': ['bananas', 3],'item4': ['pears', 3], 'item1': ['pinapples', 3]}
通过这个方法:
sorted(myDict.items(), key=lambda (k, v): v[1], reverse=True)
我只得到了正确的排名排序,但对于排名相同的对象没有进行排序:
[('item3', ['cocumbers', 11]), ('item2', ['bananas', 3]), ('item1', ['pinapples', 3]), ('item4', ['pears', 3])]
怎么在Python 2.7中解决这个问题呢?
谢谢!
2 个回答
0
你需要使用 collections.OrderedDict 来保持字典中的顺序。
5
sorted(myDict.items(), key=lambda (k, v): (-v[1],v[0]))
这个代码可以解决问题。因为rank
是一个整数,我们可以通过让关键函数返回负值来轻松实现降序排序,而不需要在sorted
中使用reverse=True
。如果出现相同的值,我们就会根据字符串的自然顺序来排序。
这个方法有效是因为在Python中,序列是按照字典顺序排序的(tuples
是一种序列类型)——Python会逐个比较序列中的元素,直到发现某个元素不相等,这样就能确定这对序列的排序。
如果你不能轻易地用关键函数替代reverse=True
,那么你需要排序两次:
l1 = sorted(myDict.items(),key=lambda (k,v):v[0])
l1.sort(key=lambda (k,v):v[1],reverse=True)
这依赖于Python排序必须是稳定的这个已知事实。换句话说,相等元素的相对顺序在排序前后是保持不变的。