如何对OrderedDict的OrderedDict进行排序 - Python

Dam*_*iak 49 python sorting nested ordereddictionary

我试图通过'depth'键在OrderedDict中对OrderedDict进行排序.是否有任何解决方案来排序该词典?

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)
  ])),
]) 
Run Code Online (Sandbox Code Playgroud)

排序的dict应如下所示:

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)
  ])), 
]) 
Run Code Online (Sandbox Code Playgroud)

任何想法如何得到它?

Thi*_*ter 97

您必须创建一个新的,因为OrderedDict按插入顺序排序.

在您的情况下,代码将如下所示:

foo = OrderedDict(sorted(foo.iteritems(), key=lambda x: x[1]['depth']))
Run Code Online (Sandbox Code Playgroud)

有关更多示例,请参阅http://docs.python.org/dev/library/collections.html#ordereddict-examples-and-recipes.

请注意Python 3,.items()而不是使用.iteritems().

  • 注意,`[1]`这里指的是foo的值,而不是它的键,它们是`[0]` (7认同)
  • 如果任何dict没有"深度"作为键,这将导致异常.这可能是期望的.如果不是,您可以使用"get"来假设默认密钥. (3认同)

Ray*_*ger 17

>>> OrderedDict(sorted(od.items(), key=lambda item: item[1]['depth']))
Run Code Online (Sandbox Code Playgroud)


joh*_*son 5

有时您可能想保留初始字典而不创建新字典。

在这种情况下,您可以执行以下操作:

temp = sorted(list(foo.items()), key=lambda x: x[1]['depth'])
foo.clear()
foo.update(temp)
Run Code Online (Sandbox Code Playgroud)