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

Vit*_*ito 0 python

我需要用两个顺序标准对这个字典进行排序:"排名"下降,"水果"上升(在相同排名结果的情况下).

这个词是以这种方式构成的

'object':['fruit',rank]
Run Code Online (Sandbox Code Playgroud)

例如,我:

myDict = {'item2': ['bananas', 3], 'item3': ['cocumbers', 11], 'item1': ['pinapples', 3], 'item4': ['pears', 3]}
Run Code Online (Sandbox Code Playgroud)

我的目标是获得这个:

{'item3': ['cocumbers', 11], 'item2': ['bananas', 3],'item4': ['pears', 3], 'item1': ['pinapples', 3]}
Run Code Online (Sandbox Code Playgroud)

sorted(myDict.items(), key=lambda (k, v): v[1], reverse=True)
Run Code Online (Sandbox Code Playgroud)

我只获得了排名的正确排序,但对于具有相同排名的对象没有排序顺序:

[('item3', ['cocumbers', 11]), ('item2', ['bananas', 3]), ('item1', ['pinapples', 3]), ('item4', ['pears', 3])]
Run Code Online (Sandbox Code Playgroud)

如何在python 2.7中解决这个问题?

谢谢

mgi*_*son 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)
Run Code Online (Sandbox Code Playgroud)

这依赖于记录的事实,即python排序必须是稳定的.换句话说,相等的元素的相对顺序在排序之前和之后是相同的.