1

我需要使用两个顺序标准对这个字典进行排序:“rank”降序,“fruit”升序(如果排名结果相同)。

dict的结构是这样的

'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 中解决这个问题?

谢谢

4

2 回答 2

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 排序必须是稳定的。也就是说,排序前后相等的元素的相对顺序是一样的。

于 2013-01-25T15:42:16.907 回答
0

您将需要使用collections.OrderedDict来维护字典内的顺序。

于 2013-01-25T15:42:36.323 回答