61

我正在尝试通过“深度”键对 OrderedDict 中的 OrderedDict 进行排序。有什么解决方案可以对该 Dictionary 进行排序吗?

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)
  ])), 
]) 

知道如何得到它吗?

4

3 回答 3

112

您必须创建一个新的,因为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().

于 2011-11-07T00:09:16.703 回答
20
>>> OrderedDict(sorted(od.items(), key=lambda item: item[1]['depth']))
于 2011-11-07T00:12:23.367 回答
4

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

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

temp = sorted(list(foo.items()), key=lambda x: x[1]['depth'])
foo.clear()
foo.update(temp)
于 2018-04-05T05:47:19.883 回答