python:在密钥上排序dicts的字典

时间:2012-04-09 16:45:55

标签: python

这样的数据结构。

{
  'ford': {'count': 3},
  'mazda': {'count': 0},
  'toyota': {'count': 1}
 }

在顶级字典值中对count的值进行排序的最佳方法是什么?

6 个答案:

答案 0 :(得分:11)

d = {'ford': {'count': 3},
     'mazda': {'count': 0},
     'toyota': {'count': 1}}

>>> sorted(d.items(), key=lambda (k, v): v['count'])
[('mazda', {'count': 0}), ('toyota', {'count': 1}), ('ford', {'count': 3})]

要将结果保留为字典,您可以使用collections.OrderedDict

>>> from collections import OrderedDict
>>> ordered = OrderedDict(sorted(d.items(), key=lambda (k, v): v['count']))
>>> ordered
OrderedDict([('mazda', {'count': 0}), ('toyota', {'count': 1}), ('ford', {'count': 3})])
>>> ordered.keys()          # this is guaranteed to come back in the sorted order
['mazda', 'toyota', 'ford']
>>> ordered['mazda']        # still a dictionary
{'count': 0}

版本问题:

  • 在Python 2.x上,您可以使用d.iteritems()代替d.items()来提高内存效率
  • collections.OrderedDict仅适用于Python 2.7和Python 3.2(及更高版本)

答案 1 :(得分:2)

dicitonary是一种无序数据结构,因此无法对其进行排序。您可以从字典OrderedDict创建一个排序列表(或者,在Python 2.7中,d):

sorted(d.iteritems(), key=lambda item: item[1]["count"])

此列表可用作collections.OrderedDict的构造函数参数。

答案 2 :(得分:0)

更清晰的方法是使用itemgetter然后使用该值来构建另一个建议的有序字典。

>>> from operator import itemgetter
>>> sorted(s,key=itemgetter,reverse=True)
['ford', 'toyota', 'mazda']

答案 3 :(得分:0)

如果要按值中的某个项对字典进行排序,则结果不能保存为dict,因为在dict中,不保留元素添加的顺序。你必须使用OrderedDict。一种解决方案是,一旦排序,就会从(键,值)元组列表中生成一个OrderedDict。

>>> collections.OrderedDict(sorted(d.iteritems(),key=lambda x:x[1]["count"],reverse=True))
OrderedDict([('ford', {'count': 3}), ('toyota', {'count': 1}), ('mazda', {'count': 0})])
>>> 

答案 4 :(得分:0)

我认为 dict 哈希表,因此实际上无法对其进行排序。尝试将已排序的值存储到列表中,可以进行排序:

l = []
for x in sorted(dictionary.keys()):
    l.append([dictionary[x]])

如果你真的想保留密钥,也可以将它们添加到列表中。只要确保在访问列表时,偶数索引(0,2,4,...)是键,奇数索引是值(1,3,5,...)

答案 5 :(得分:0)

如果你的dict被命名为x,那么你可以获得一个键列表: sorted_x = sorted(x,key = lambda a:x [a] [' count']) sorted_x是: [' mazda',' toyota',' ford']

然后你可以打印: for sorted in sorted_x:     print x [i]

结果: {' count':0} {' count':1} {' count':3}