如何通过更新OrderedDict来保持订单

时间:2018-01-15 07:21:20

标签: python python-3.5 ordereddictionary

请告诉我。

描述

我想使用dict的update方法更新OrderedDict类型变量的值。 但是,执行更新方法后,更新目标变量的OrderedDict类型将丢失,并且无法按预期输出。

提问点:

  1. 丢失OrderedDict的类型
  2. 是否有问题
  3. 是否有另一种更新dict的方法,同时保持OrderedDict的类型?
  4. 以下是问题的一个例子。

    from collections import OrderedDict
    
    dic = OrderedDict()
    
    dic['a'] = 1
    dic['b'] = OrderedDict()
    dic['b']['b1'] = 2
    dic['b']['b2'] = 3
    dic['b']['b3'] = 4
    
    print(dic)
    > OrderedDict([('a', 1), ('b', OrderedDict([('b1', 2), ('b2', 3), ('b3', 4)]))]) # ok
    
    new_dic = {'a': 2, 'b': {'b1': 3, 'b2': 4, 'b3': 5}}
    print(new_dic)
    > {'a': 2, 'b': {'b1': 3, 'b2': 4, 'b3': 5}}
    
    dic.update(new_dic)
    
    print(dic)
    > OrderedDict([('a', 2), ('b', {'b1': 3, 'b2': 4, 'b3': 5})]) # NG: Type has been lost
    

3 个答案:

答案 0 :(得分:3)

更新具有重新绑定受影响的密钥的效果。简而言之,就是:

# ...
dic['b'] = OrderedDict()
# ...
dic['b'] = {'b1': 3, 'b2': 4, 'b3': 5}
# ...

'b'中密钥dic的新值现在是常见的dict。您正在尝试执行一些未提供的嵌套更新。你可以自己实现它:

def update(d1, d2):
    for k, v in d2.items():
        if k in d1 and isinstance(v, dict) and isinstance(d1[k], dict):
            update(d1[k], v)
        else:
            d1[k] = v

现在您可以将它应用到您的案例中:

update(dic, new_dic)
# OrderedDict([('a', 2), ('b', OrderedDict([('b1', 3), ('b2', 4), ('b3', 5)]))])

答案 1 :(得分:1)

更改此行

new_dic = {'a': 2, 'b': {'b1': 3, 'b2': 4, 'b3': 5}}

new_dic = {'a': 2, 'b': OrderedDict([('b1', 3), ('b2', 4), ('b3', 5)])}

没关系!

答案 2 :(得分:0)

from collections import OrderedDict

dic = OrderedDict()

dic['a'] = 1
dic['b'] = OrderedDict()
dic['b']['b1'] = 2
dic['b']['b2'] = 3
dic['b']['b3'] = 4

print(dic)
#> OrderedDict([('a', 1), ('b', OrderedDict([('b1', 2), ('b2', 3), ('b3', 4)]))]) # ok

new_dic = {'a': 2, 'b': {'b1': 3, 'b2': 4, 'b3': 5}}
new_dic['b'] = OrderedDict(new_dic['b'])
print(new_dic)
#> {'a': 2, 'b': OrderedDict([('b1', 3), ('b2', 4), ('b3', 5)])}    
dic.update(new_dic)

print(dic)
#> OrderedDict([('a', 2), ('b', OrderedDict([('b1', 3), ('b2', 4), ('b3', 5)]))])