【问题标题】:How to keep the order by updating OrderedDict如何通过更新 OrderedDict 来保持订单
【发布时间】:2018-01-15 07:21:19
【问题描述】:

请告诉我。

说明

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

问题点:

  1. 丢失OrderedDict的类型是否有问题?
  2. 在保持OrderedDict 类型的同时更新dict 是否有另一种方法?

下面是问题的一个例子。


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


【解决方案1】:

更新具有重新绑定受影响键的效果。简而言之,您所做的是:

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

dic 中键 'b' 的新值现在是常见的 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)]))])

【讨论】:

    【解决方案2】:

    改变这一行

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

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

    没关系!

    【讨论】:

      【解决方案3】:
      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)]))])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-02
        • 1970-01-01
        • 2018-08-09
        • 2021-04-03
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        相关资源
        最近更新 更多