2

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

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

但是,如果我想对 dict 中的值进行排序以便我仍然拥有键怎么办?输出应如下所示:

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

有什么方法可以做到这一点吗?

4

5 回答 5

6

您无法获得字典作为结果,因为它们本质上是无序的。但是,您可以获得(键,值)对的列表,如果您使用该key参数,则相当容易。例如:

sorted(mydict, key=mydict.get)

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

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

于 2012-09-25T14:12:02.823 回答
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)])
于 2012-09-25T14:22:11.747 回答
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)]
于 2012-09-25T14:14:06.137 回答
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)]
于 2012-09-25T14:18:52.483 回答
1

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

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}
于 2012-09-25T14:11:33.307 回答