2011-10-12 147 views
20

这似乎是它必须是一个傻瓜,但我的SO-搜索夫今天是差...排序按值字典然后按键

说我有整数键/值的字典,怎么能我按降序对字典进行排序,然后按键降序排列(对于常见值)。

输入:

{12:2, 9:1, 14:2} 
{100:1, 90:4, 99:3, 92:1, 101:1} 

输出:

[(14,2), (12,2), (9,1)] # output from print 
[(90,4), (99,3), (101,1), (100,1), (92,1)] 

回答

37
In [62]: y={100:1, 90:4, 99:3, 92:1, 101:1} 
In [63]: sorted(y.items(), key=lambda x: (x[1],x[0]), reverse=True) 
Out[63]: [(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)] 

key=lambda x: (x[1],x[0])的告诉sorted,对于在y.items()每个项目x,使用(x[1],x[0])作为要排序的代理值。由于x的形式是(key,value),因此(x[1],x[0])的收益率为(value,key)。这会导致sorted首先按value排序,然后按key排序。

reverse=True告诉sorted以降序而不是升序显示结果。

查看此wiki page了解有关Python中排序的优秀教程。

PS。我尝试使用key=reversed来代替,但reversed(x)返回一个迭代器,它在此处不进行比较。

+1

+1:很好用Python的内置功能。 – EOL

+0

我没有得到相同的输出......我找到了第一版的答案,它完全符合我的需要。 –

+2

不错,但有点cri ... ......但我想不出任何简单的事情。 – Don

1

试试这个:

>>> d={100:1, 90:4, 99:3, 92:1, 101:1} 
>>> sorted(d.items(), lambda a,b:b[1]-a[1] or a[0]-b[0]) 
2

也许这是更为明确:

>>> y = {100:1, 90:4, 99:3, 92:1, 101:1} 
>>> reverse_comparison = lambda (a1, a2), (b1, b2):cmp((b2, b1), (a2, a1)) 
>>> sorted(y.items(), cmp=reverse_comparison) 
[(90, 4), (99, 3), (101, 1), (100, 1), (92, 1)]