如何在保留字符键的同时对字典进行排序?

时间:2012-09-25 14:08:53

标签: python sorting dictionary

我知道可以使用以下方法对其值进行排序:

>>> mydict = {'silver': 300, 'gold': 500, 'bronze': 100, 'platinum': 1000}
>>> items = mydict.items()
>>> print sorted([value for key, value in items])
[100, 300, 500, 1000]

但是如果我想对里面的值进行排序,那么我还有钥匙呢?输出应如下所示:

{'platinum': 1000, 'gold': 500, 'silver': 300, 'bronze': 100}

有没有办法实现这个目标?

6 个答案:

答案 0 :(得分:6)

你不能得到字典作为结果,因为那些本质上是无序的。您可以获得(键,值)对的列表,如果您使用key参数,则相当容易。例如:

sorted(mydict, key=mydict.get)

对于降序,请反转结果列表或将reverse=True作为另一个参数传递给sorted

请注意,您可以使用其结果构建OrderedDict

答案 1 :(得分:2)

字典是无序数据结构,因此无法对其进行排序。但是你可以将它转换为元组列表并在元组的第二项上进行排序:

>>> mydict = {'silver': 300, 'gold': 500, 'bronze': 100, 'platinum': 1000}
>>> sorted(mydict.items(), key = lambda (metal, price): -price)
[('platinum', 1000), ('gold', 500), ('silver', 300), ('bronze', 100)]

答案 2 :(得分:2)

>>> mydict = {'silver': 300, 'gold': 500, 'bronze': 100, 'platinum': 1000}
>>> from operator import itemgetter
>>> from collections import OrderedDict
>>> od = OrderedDict(sorted(mydict.items(),  key=itemgetter(1), reverse=True))
>>> od
OrderedDict([('platinum', 1000), ('gold', 500), ('silver', 300), ('bronze', 100)])

答案 3 :(得分:1)

如果您只想做打印,那么您仍然拥有钥匙;只打印那些:

from operator import itemgetter 

print '{' + ', '.join([': '.join(map(repr, item)) for item in sorted(items, key=itemgetter(1), reverse=True)]) + '}'

输出:

>>> print '{' + ', '.join([': '.join(map(repr, item)) for item in sorted(mydict.items(), key=itemgetter(1), reverse=True)]) + '}'
{'platinum': 1000, 'gold': 500, 'silver': 300, 'bronze': 100}

答案 4 :(得分:1)

你试过这个吗,

    mydict = {'silver': 300, 'gold': 500, 'bronze': 100, 'platinum': 1000}
    from operator import itemgetter
    sorted(mydict.items(), key=itemgetter(1),  reverse=True)
    o/p = > [('platinum', 1000), ('gold', 500), ('silver', 300), ('bronze', 100)]

答案 5 :(得分:0)

无法按定义对字典进行排序。您可能希望检索其项目并将其添加到已排序的数组中。