我需要用两个顺序标准对这个字典进行排序:" rank"降序,"水果"升序(如果排名结果相同)。
dict的结构是这样的
'object':['fruit',rank]
例如我' ve:
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中解决这个问题?
感谢' S
答案 0 :(得分:5)
sorted(myDict.items(), key=lambda (k, v): (-v[1],v[0]))
应该做的伎俩。由于rank
是一个整数,因此我们可以通过使关键函数返回负值而不是将reverse=True
关键字需要sorted
来轻松降序排序。在平局的情况下,我们会依赖于字符串的自然顺序。
这是因为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排序必须是稳定的。换句话说,在排序之前和之后,相等元素的相对顺序是相同的。
答案 1 :(得分:0)
您需要使用collections.OrderedDict维护dicts中的顺序。