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

问题描述 投票:1回答:3

请告诉我。

描述

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

问题点:

  1. 失去OrderedDict的类型是错误的吗?
  2. 还有另一种方法来更新dict同时保持OrderedDict的类型?

以下是问题的示例。


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

python python-3.5 ordereddictionary
3个回答
2
投票

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

# ...
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
投票

改变这一行

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

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

没关系!


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)]))])
© www.soinside.com 2019 - 2024. All rights reserved.