2
dic = {'Tea': 35, 'Coffee': 35, 'Chocolate': 10}

我想按值按降序对这个字典进行排序,但是我怎样才能访问键呢?

示例代码:

for x in sorted(dic.values()):
    print(key, dic[key])

我还希望在值相等时按字母顺序对输出进行排序。

预期输出:

Coffee 35
Tea 35
Chocolate 10
4

3 回答 3

9

您想要的是提供元组dict.items()方法(key, value)

要按值排序,然后使用一种key方法,在这种情况下,anoperator.itemgetter()从元组中获取第二个值进行排序,然后设置reverse属性以按您想要的顺序获取它们。

>>> from operator import itemgetter
>>> dic={'Tea': 35, 'Coffee': 35, 'Chocolate': 10}
>>> for key, value in sorted(dic.items(), key=itemgetter(1), reverse=True):
...     print(key, value)
... 
Tea 35
Coffee 35
Chocolate 10

编辑:如果你想按键排序作为二级排序,我们可以简单地传递一个值的元组,Python 将排序第一个值,然后是第二个,等等......唯一的问题是使用反向将意味着我们得到他们以错误的顺序。作为一种技巧,我们只需使用负数版本的值进行排序,而无需反向:

>>> for key, value in sorted(dic.items(), key=lambda x: (-x[1], x[0])):
...     print(key, value)
... 
Coffee 35
Tea 35
Chocolate 10
于 2012-06-21T13:18:40.780 回答
7

一种选择:

for key in sorted(dic, key=dic.get, reverse=True):
    print(key,dic[key])

这对字典的键进行排序,但dic.get用作键功能,从而有效地按值排序。您的示例输出表明您要按降序排序,所以我包括了reverse=True.

编辑:如果您的字典值实际上是计数,您可以考虑使用 acollections.Counter而不是字典。该类有一个most_common()按所需顺序返回项目的方法。

于 2012-06-21T13:18:13.073 回答
1

其他建议的答案dict.items()部分正确。但是由于您想在排序过程中包含密钥(如果我理解您是正确的),您想要反转项目(本质上是一个 tuple (key, value))。所以使用

data={'Tea': 35, 'Coffee': 35, 'Chocolate': 10}
for item in sorted(dic.items(), key=lambda it: (-it[1], it[0])):
    print item

key参数给出了一个用于对项目进行排序的函数。它将项目转换为一个键,然后真正用于排序。

在您的情况下,您需要混合降序/升序排序,以便首先将此处给出的项目变成

(-35, 'Coffee')
(-35, 'Tea')
(-10, 'Chocolate')

并按该顺序打印。(替换过程只是为了排序而发生的,实际返回的项目是原始项目。)

于 2012-06-21T13:29:15.000 回答