使用Python内置的sorted函数对字典中的值进行排序

6

我需要按照值的降序(最大值在字典中显示在第一位)获取字典的排序表示。

样例:

mydict={u'jon':30,u'den':26,u'rob':42,u'jaime':31}

我需要展示它们像这样:
rob=42
jaime=31
jon=30
den=28

我尝试了这个。
from operator import itemgetter
sortedvalues=sorted(mydict,key=itemgetter(1))

当我打印列表时,我得到了以下结果。
[u'jaime', u'den', u'rob', u'jon']

这个列表是无序的!我是否忽略了sorted内置函数的用法?还是我使用itemgetter不正确?

3个回答

11

这是一个有趣的问题,因为你并没有像如果键是另一种不可索引的类型(比如整数)那样导致错误,这是由于一系列微妙的事情:

  1. sorted(mydict, ...) 尝试使用等同于 iter(mydict) 的方式迭代字典,它将调用 mydict.__iter__()
  2. 迭代字典会产生它的,实际上 iter(mydict) 等同于 mydict.iterkeys()
  3. 你的键是字符串,并且由于字符串是可索引的,itemgetter(1) 将在字符串值上工作,获取字符串中的第二个字符。

如果任何字符串的长度为1,你的代码也将失败,并引发 IndexError 错误,只是你侥幸避开了它。(或者也可以说没有,这取决于你怎么看待它,因为引发 IndexError 错误会让你更早地意识到这个问题。)

如果你只想要值,你需要做的是:

sorted(mydict.values(), reverse=True)

如果你想要键值对一起返回,你需要

sorted(mydict.iteritems(), key=itemgetter(1), reverse=True)

1
我在阅读这个回复之前就意识到了!并且已经改成了mydict.iteritems()..感谢您的帮助。 - Damon Julian
我们应该在什么情况下使用 dict.iteritems() 而不是 dict.items()? - Damon Julian
1
如果你只想要键:sorted(mydict, key=mydict.get, reverse=True) - John La Rooy
当程序正确性不依赖于显式复制数据时,请使用.iteritems() - Karl Knechtel

5

这些名称按第二个字母排序;遍历字典会得到它的键。

sorteditems = sorted(mydict.iteritems(), key=itemgetter(1))

3

遍历字典(这也是sorted函数所做的)只会给你它的键:

>>> sorted(mydict)
[u'den', u'jaime', u'jon', u'rob']

相反,你希望对键和值进行排序 - 为此,你将使用mydict.items()(或mydict.iteritems(),在处理大字典时更有效):

>>> sorted(mydict.items())
[(u'den', 26), (u'jaime', 31), (u'jon', 30), (u'rob', 42)]

然后您的代码就会按预期工作:
>>> from operator import itemgetter
>>> sorted(mydict.items(), key = itemgetter(1))
[(u'den', 26), (u'jon', 30), (u'jaime', 31), (u'rob', 42)]

如果多个键具有相同的值,您可能还希望使用dict的键作为第二排序值进行排序:

>>> mydict={u'a': 1, 'z': 1, 'd': 1}
>>> sorted(mydict.items(), key = itemgetter(1))
[(u'a', 1), ('z', 1), ('d', 1)]
>>> sorted(mydict.items(), key = itemgetter(1, 0))
[(u'a', 1), ('d', 1), ('z', 1)]

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