使用排序的内置函数对python dict的值进行排序

时间:2012-03-24 04:40:05

标签: python sorting

我需要得到一个dict的有序表示,按值的降序排序(dict中的最大值,首先显示)。

样品:

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']

此列表无序!我错过了有关排序内置的用法吗?或者我是否错误地使用了itemgetter?

3 个答案:

答案 0 :(得分:11)

这是一个有趣的问题,因为如果键是另一个不可索引的类型(比如整数),你就不会出现错误,这是由于一系列微妙的事情:

  1. sorted(mydict,...)尝试使用相当于iter(mydict)的字典来迭代字典,这将调用mydict.__iter__()
  2. 迭代字典会产生,实际上iter(mydict)mydict.iterkeys()相同。
  3. 您的密钥是字符串,由于字符串是可索引的,itemgetter(1)将处理字符串值,获取字符串中的第二个字符。
  4. 如果任何字符串的长度都是1-char,那么你所拥有的代码会因为IndexError而失败,你只是幸运的。 (或者没有,取决于你如何看待它,因为获得IndexError会让你更快地意识到这个问题。)

    如果您只想要值,您想要做的是:

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

    如果您想要成对的按键,则需要

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

答案 1 :(得分:5)

它们按名称中的第二个字母排序;迭代一个字典产生它的键。

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

答案 2 :(得分: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)]