web-dev-qa-db-ja.com

OrderedDictのOrderedDictをソートする方法-Python

OrderedDictのOrderedDictを'depth'キーでソートしようとしています。その辞書をソートする解決策はありますか?

OrderedDict([
  (2, OrderedDict([
    ('depth', 0),  
    ('height', 51), 
    ('width', 51),   
    ('id', 100)
  ])), 
  (1, OrderedDict([
    ('depth', 2),  
    ('height', 51), 
    ('width', 51),  
    ('id', 55)
  ])), 
  (0, OrderedDict([
    ('depth', 1),  
    ('height', 51), 
    ('width', 51),  
    ('id', 48)
  ])),
]) 

ソートされた辞書は次のようになります。

OrderedDict([
  (2, OrderedDict([
    ('depth', 0),  
    ('height', 51), 
    ('width', 51),   
    ('id', 100)
  ])), 
  (0, OrderedDict([
    ('depth', 1),  
    ('height', 51), 
    ('width', 51),  
    ('id', 48)
  ])),
  (1, OrderedDict([
    ('depth', 2),  
    ('height', 51), 
    ('width', 51),  
    ('id', 55)
  ])), 
]) 

それを取得する方法はありますか?

46
Damian Gądziak

OrderedDictは挿入順序でソートされるため、新しいものを作成する必要があります。

あなたの場合、コードは次のようになります。

_foo = OrderedDict(sorted(foo.iteritems(), key=lambda x: x[1]['depth']))
_

その他の例については、 http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes を参照してください。

Python 3の場合、.items()の代わりに.iteritems()を使用する必要があります。

92
ThiefMaster
>>> OrderedDict(sorted(od.items(), key=lambda item: item[1]['depth']))
16

場合によっては、新しい辞書を作成せずに最初の辞書を保持したい場合があります。

その場合、次のことができます。

temp = sorted(list(foo.items()), key=lambda x: x[1]['depth'])
foo.clear()
foo.update(temp)
3
johnson