2012-04-09 17 views
3

このようなデータ構造。python:キーのdictsのdictのソート

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

トップレベルの辞書の値の範囲内countの値を並べ替えるための最良の方法は何ですか?

+0

ディクショナリは順序付けされていないデータ型です。ソートすることはできません。 'collections.OrderedDict'を使うことができます。 – 0xc0de

答えて

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(a nd higher)
2

dicitonaryは順序付けられていないデータ構造なので、ソートすることはできません。あなたの辞書dから(やPython 2.7で、OrderedDictをか)ソートされたリストを作成することができます。

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

このリストはcollections.OrderedDictのコンストラクタの引数として使用することができます。

0

さらに洗練された方法では、itemgetterを使用して、その値を使用して順序付けされたdictをもう一方の提案として構築します。

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

あなたが値でいくつかの項目で辞書をソートしたい場合は辞書で、要素の追加の順序は保持されないため、結果はあなたは、辞書として保存することはできません。あなたはOrderedDictを使用する必要があることを示します。 1つのソリューションは、いったんソートされると、(キー、値)タプルのリストからOrderedDictを生成します。

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

私は1つが実際にそれを並べ替えることはできませんので辞書は、ハッシュテーブルだと思います。 ソートすることができ、リスト、に分類値を格納してみてください。

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

あなたが本当に鍵を保持したい場合は、おそらくだけでなく、リストに追加します。リストにアクセスすると、インデックス(0,2,4、...)もキーで、奇数インデックスは値(1,3,5、...)であることを確認してください。

0

sorted_x = sorted(x、key = lambda a:x [a] ['count']) ここでsorted_xは ['mazda'、 'toyota'、 'フォード']次に

あなたが印刷することができ: をiについてsorted_xで: 印刷X [i]は

結果: { 'カウント':0} { 'カウント':1} {[カウント': 3}

関連する問題