如何使用列表中的值对dict进行排序(两个连续标准)

时间:2013-01-25 15:40:45

标签: python

我需要用两个顺序标准对这个字典进行排序:" 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

2 个答案:

答案 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中的顺序。