2017-07-15 20 views
1

辞書の辞書をソートしようとしています。私はエントリの末尾に数字をもとに、この辞書をソートしたい辞書内でのPython辞書の並べ替え

{'RandomUserName': defaultdict(<type 'int'>, {'6/30/15': 2}), 
'AnotherRandomUserName': defaultdict(<type 'int'>, {'5/25/16': 8}), 
'AThirdRandomUserName': defaultdict(<type 'int'>, {'1/12/15': 5})} 

:様々なユーザ名、日付、および数値でより数百万のエントリ程度がある以外私の辞書には、次のようになります。私は辞書をソートすることは不可能であり、ソートされた表現しか返すことができないことを知っています。それはまさに私がやろうとしていることです。

私はディクショナリ内で辞書をソートする方法の答えを探していましたが、すべての答えは値の前にキーを知っていると仮定しています。もしそうでなければ?最後の整数に基づいてこれをどのようにソートできますか?

ありがとうございます、私はすべての答えに感謝します!

+1

[値によってPythonの辞書をソート]の可能複製(HTTPS ://stackoverflow.com/questions/613183/sort-a-python-dictionary-by-value) – alfasin

+0

これをチェックしましたか[link](https://stackoverflow.com/questions/613183/sort-a-python-辞書による値) – imanzabet

+0

'RandomUserName'に' {'6/30/15':2、 '6/30/16':3} 'のような2つのキーで' dict'が含まれているとどうなりますか? – randomir

答えて

1

私の頭に浮かぶ最初の解決策は、辞書を平らにし、結果リストを並べ替えることです。例えば

dictionary_of_dictionaries = { 
    'RandomUserName': {'6/30/15': 2}, 
    'AnotherRandomUserName': {'5/25/16': 8}, 
    'AThirdRandomUserName': {'1/12/15': 5} 
} 


flattened = [(k,) + tuple(dic.iteritems()) for k, dic in dictionary_of_dictionaries.iteritems()] 
print flattened 

プリント:

[('AnotherRandomUserName', ('5/25/16', 8)), ('RandomUserName', ('6/30/15', 2)), ('AThirdRandomUserName', ('1/12/15', 5))] 

そして、あなたがそれらをしたいために、エントリを印刷し

flattened.sort(key= lambda x:x[1][1]) 
print flattened 

このリストをソートします。

[('RandomUserName', ('6/30/15', 2)), ('AThirdRandomUserName', ('1/12/15', 5)), ('AnotherRandomUserName', ('5/25/16', 8))] 

この最初の溶液中で、私は2番目の辞書が一つだけ日付フィールドが含まれていることを想定していないことをしてください。もっと複雑な例では、内側の辞書のタプルが常に同じ順序で平坦化されていることを確認する必要があります。


この問題を解決ソリューション(あなたの内側の辞書はフィールドのトンが含まれている場合は非常にパフォーマンスではありません)

dictionary_of_dictionaries = { 
    'RandomUserName': {'6/30/15': 2 , 'name' : 'foo'}, 
    'AnotherRandomUserName': {'5/25/16': 8, 'name' : 'bar'}, 
    'AThirdRandomUserName': {'1/12/15': 5, 'name' : 'baz' } 
} 


flattened = [(k,) + tuple(sorted(dic.iteritems(), key=lambda x: x[0])) for k, dic in dictionary_of_dictionaries.iteritems()] 
print flattened 


flattened.sort(key= lambda x:x[1][1]) 
print flattened 
+0

それはうまくいった!私はそれを感謝します、Thundzz –

関連する問題