3

像这样的数据结构。

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

count在顶级dict的值中排序的最佳方法是什么?

4

6 回答 6

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(及更高版本)
于 2012-04-09T16:48:03.953 回答
2

字典是无序的数据结构,因此无法排序。OrderedDict你可以从你的字典中创建一个排序列表(或者,在 Python 2.7 中,一个) d

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

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

于 2012-04-09T16:48:10.883 回答
0

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

>>> collections.OrderedDict(sorted(d.iteritems(),key=lambda x:x[1]["count"],reverse=True))
OrderedDict([('ford', {'count': 3}), ('toyota', {'count': 1}), ('mazda', {'count': 0})])
>>> 
于 2012-04-09T16:59:11.880 回答
0

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

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

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

于 2013-11-28T23:09:11.327 回答
0

一种更简洁的方法是使用 itemgetter,然后使用该值来构建一个有序的字典,就像另一个建议的那样。

>>> from operator import itemgetter
>>> sorted(s,key=itemgetter,reverse=True)
['ford', 'toyota', 'mazda']
于 2012-04-09T16:53:56.840 回答
0

如果您拥有的字典名为 x,那么您可以获得键列表: sorted_x = sorted(x, key=lambda a: x[a]['count']) 其中 sorted_x 是: ['mazda', '丰田','福特']

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

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

于 2014-03-17T18:51:02.600 回答