簡體   English   中英

python:根據鍵對字典排序

[英]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}

版本問題:

  • 在 Python 2.x 上,您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM