[英]python: sorting a dict of dicts on a key
像这样的数据结构。
{
'ford': {'count': 3},
'mazda': {'count': 0},
'toyota': {'count': 1}
}
在顶级字典的值内对count
的值进行排序的最佳方法是什么?
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}
版本问题:
d.iteritems()
而不是d.items()
以获得更好的 memory 效率collections.OrderedDict
仅适用于 Python 2.7 和 Python 3.2(及更高版本)字典是一种无序的数据结构,因此无法排序。 您可以从字典d
创建一个排序列表(或者,在 Python 2.7 中,一个OrderedDict
):
sorted(d.iteritems(), key=lambda item: item[1]["count"])
此列表可用作collections.OrderedDict
的构造函数参数。
一种更简洁的方法是使用 itemgetter,然后使用该值来构建一个有序的 dict,就像另一个建议的那样。
>>> from operator import itemgetter
>>> sorted(s,key=itemgetter,reverse=True)
['ford', 'toyota', 'mazda']
如果您想按值中的某些项目对字典进行排序,则不能将结果保存为字典,因为在字典中不会保留元素添加的顺序。 你必须使用 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})])
>>>
我认为dict是一个hash table ,所以实际上不能对它进行排序。 尝试将排序后的值存储到一个可以排序的列表中:
l = []
for x in sorted(dictionary.keys()):
l.append([dictionary[x]])
如果您真的想保留密钥,也可以将它们添加到列表中。 只需确保在访问列表时,偶数索引 (0,2,4,...) 是键,奇数索引是值 (1,3,5,...)
如果你的字典名为 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}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.