2012-03-07 21 views
1

これをソートする方法辞書によって​​のPythonで?結果にPythonの他の辞書の値で辞書をソート

{ 
    1 : { 
    'votes' : 2, 
    'id' : 10 
    }, 
    2 : { 
    'votes' : 10, 
    'id' : 12 
    }, 
    3 : { 
    'votes' : 98, 
    'id' : 14 
    } 
} 

中:

{ 
    3 : { 
    'votes' : 98, 
    'id' : 14 
    }, 
    2 : { 
    'votes' : 10, 
    'id' : 12 
    }, 
    1 : { 
    'votes' : 2, 
    'id' : 10 
    } 
} 
+5

辞書はソートされていません。 –

+1

辞書は順不同です。あなたの投稿の2つの辞書は同じです。 –

+0

辞書には注文がないため、並べ替えができません。あなたは本当に何を達成しようとしていますか? –

答えて

4

あなたはOrderedDictを使用することができます。

>>> from collections import OrderedDict 
>>> od = OrderedDict(sorted(d.items(), 
        key=lambda t: t[1]['votes'], 
        reverse=True)) 
>>> od 
OrderedDict([(3, {'votes': 98, 'id': 14}), 
      (2, {'votes': 10, 'id': 12}), 
      (1, {'votes': 2, 'id': 10})]) 

dは、あなたのオリジナルの辞書です。

3

ディクショナリは特定の順序で辞書の要素にアクセスできるようにするには、jcolladoの答えのようにOrderedDictを使用するか、興味のあるメトリックでキーのリストを並べ替えるだけです例:

data = {1: {'votes': 2, 'id': 10}, 2: {'votes': 10, 'id': 12}, 3: {'votes': 98, 'id': 14}} 
votes_order = sorted(data, key=lambda k: data[k]['votes'], reverse=True) 
for key in votes_order: 
    print key, ':', data[key] 

出力:

3 : {'votes': 98, 'id': 14} 
2 : {'votes': 10, 'id': 12} 
1 : {'votes': 2, 'id': 10} 
0

標準辞書はので、それらが意味をなさないソート、順序を持っていません。これらの辞書は全く同じです。

おそらくあなたが望むのはリストですか?

aslist = originaldict.values() 
aslist.sort(key=lambda item:item['votes'], reverse=True) 

これは、リストとしてあなたのdictから項目を抽出し、votesしてリストを訴えます。

+0

後でアイテムを直接リカバリするためにハッシュが必要です。しかし、私はマウントし、他のものに辞書をソートする前に。 –

+0

dictを "プール"として使用し、ソートされたリストをインデックスとして使用します。 (項目はコピーされないので、複数のデータ構造で同じリーフ辞書を使用することができます)。Dicts *には注文*はありません。したがって、注文が重要な場合は別のものを使用する必要があります。ところで、リストの項目get/setはO(1)(dictよりも速い)なので、元のdictでも、すべてのリストを使う方が良いかもしれません! –

0

また、辞書内の項目を並べ替えることができます:

print sorted(d.items(), key=lambda x: x[1]['votes'], reverse=True) 

フランシスの提案のように、しかし、あなたはすべてのアイテムの元のキーを知っています。

+0

私は自分のスピードでちょっとした作業をしなければならない... –

+0

**辞書には注文がありません!!! ** –