Как сохранить заказ, обновив OrderedDict

Скажи пожалуйста.

Описание

Я хотел бы обновить значение переменной типа OrderedDict используя метод обновления dict. Однако после выполнения метода обновления 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

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

Изменить эту строку

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

в

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

Это было бы хорошо!

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)]))])
Другие вопросы по тегам