按值和键排序字典

51

我可以按键或值排序,但我需要按值排序,然后按键在同一行中进行排序。为了更好地解释这个问题,我可以向您展示我的问题:

dict = {'apple': 2, 'banana': 3, 'almond':2 , 'beetroot': 3, 'peach': 4}

我希望我的输出按照值的降序和键的升序(按字母表顺序)排序。这样会得到这样一个列表:

对于输出: ['peach', 'banana', 'beetroot', 'almond', 'apple']

目前我所知道的唯一方法是:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k))]

输出结果为:['almond', 'apple', 'banana', 'beetroot', 'peach']

因此,它按升序对值进行了排序,并按字母顺序(A-Z)对键进行了排序。所以如果我反转它:

[v[0] for v in sorted(dict.items(), key=lambda(k,v): (v,k), reverse=True)]

使用以下代码可以实现将字典中的值按降序排列,同时将键以升序排列:


d = {'peach': 1, 'beetroot': 2, 'banana': 3, 'apple': 4, 'almond': 5}
result = [k for k, v in sorted(d.items(), key=lambda item: (-item[1], item[0]))]

输出结果为:['almond', 'apple', 'banana', 'beetroot', 'peach']

3个回答

59

你需要利用数值本身的特点。

>>> [v[0] for v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']

37
提醒一下,Python 3 删除了元组参数解包功能,所以上述代码应该改为[v[0] for v in sorted(d.items(), key=lambda kv: (-kv[1], kv[0]))]。详见 PEP 3113 https://www.python.org/dev/peps/pep-3113/。 - Gui Ambros
3
如果您不需要反转键/值中的一个顺序,关键函数也可以编写为operator.itemgetter(1, 0) - Moberg
1
key=lambda(k, v): (-v, k)) 这是什么意思?我知道lambda是一个匿名函数,但它没有返回语句让人感到困惑。 - Dr. Chocolate
1
@NickKiermaier:表达式返回的内容。 - Ignacio Vazquez-Abrams
我明白了。谢谢。 - Dr. Chocolate
@GuiAmbros,“lambda kv:(-kv [1]...”太糟糕了。 3中没有其他语法支持吗? - alancalvitti

6
按降序排序是指对于可否定的数量,按值的负数升序排序。
[v[0] for v in sorted(dict.items(), key=lambda(k,v): (-v,k))]

2
>>> d = {'apple':2, 'banana':3, 'almond':2, 'beetroot':3, 'peach':4}
>>> [k for k, v in sorted(d.iteritems(), key=lambda(k, v): (-v, k))]
['peach', 'banana', 'beetroot', 'almond', 'apple']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接