【问题标题】:Changing the value of a key in a nested dictionary in Python在 Python 中更改嵌套字典中键的值
【发布时间】:2020-06-22 13:33:32
【问题描述】:

我在更新嵌套字典中的值时遇到了一些问题。

my_dic = {'TypeA': {'Bit0': {'TypeA': {'Bit0': 'A', 'Bit1': 'B', 'Bit2' : 'C'}, 'TypeB': 'D', 'TypeC': 'E'}, 'Bit1': 'F', 'Bit2': 'G'}, 'TypeB': 'H'}

我需要用新字典更新具有值 A、B 和 C 的字典

new_dic = {Sensor Error: {'Bit0' : 'X', 'Bit1': 'Y', 'Bit2': 'Z'}}

我不想要一个新功能来做这件事。这出现在我需要更新字典的处理中的某个地方。这可以使用while循环或for循环来完成吗?经历了其他堆栈溢出问题。找不到这样的东西。所有这些问题都有一个功能,并且最多在字典的两层内迭代。字典在这里可以有任何深度。

def recursive_lookup(k, d):
if k in d: return d[k]
for v in d.values():
    if isinstance(v, dict):
        a = recursive_lookup(k, v)
        if a is not None: return a
return None

尝试了这段代码,发现这对任何深度都不起作用。另外,这不符合我的要求。我不需要函数来查找键并替换它的值。

详细来说,字典基本上都是错误和错误词。

my_dic = {
          'System Error': {
                           'Bit0': 'Out of Sync'
                           'Bit1': {
                                    'Sensor Error':{                                              
                                                    'Bit0': 'Out of Range Error'
                                                    'Bit1': 'Communication Error'
                                                   }
                                    }
                            'Bit2': 'System Unresponsive Error'
                            }
          }

这是my_dic的应用

期望的输出是:

my_dic = {
              'System Error': {
                               'Bit0': 'Out of Sync'
                               'Bit1': {
                                        'Sensor Error':{                                              
                                                        'Bit0': 'X'
                                                        'Bit1': 'Y'
                                                        'Bit2': 'Z'
                                                       }
                                        }
                                'Bit2': 'System Unresponsive Error'
                                }
              }

【问题讨论】:

  • 您能解释一下new_dic 是如何生成的吗?
  • 听起来你需要一个递归函数来深入你的数据结构。
  • 我不确定我是否完全理解了这个问题,为什么my_dic['TypeA']['Bit0']['TypeA'] = new_dic 不起作用?
  • 我不想那样硬编码。有一个文件,我从中创建了这本字典。文件中的数据可能会更改,并且深度可能会有所不同。我想以通用的方式处理它。 @CoryNezin
  • 为什么会出现“我不想要一个新功能这样做”的限制?没有函数就不能有递归函数。 :)

标签: python python-2.7 dictionary


【解决方案1】:

您的示例 my_dic 如下所示。所以你的查找k"TypeA"?但是还有一个 "Bit0" 键嵌套在第一级 "TypeA" 字典中。对此有何规定?我不理解您在此处尝试实现的“查找规则”。

{
    "TypeA": {
        "Bit0": {
            "TypeA": {
                "Bit0": "A",
                "Bit1": "B",
                "Bit2": "C"
            },
            "TypeB": "D",
            "TypeC": "E"
        },
        "Bit1": "F",
        "Bit2": "G"
    },
    "TypeB": "H"
}

查找规则:

  1. 第一级必须有密钥k(“TypeA”)
  2. 二级可以有任意键,但必须是字典类型,舍弃所有非字典?
  3. 第三级必须有密钥k(“TypeA”)?

【讨论】:

  • 我已经用字典@kamion的应用示例更新了问题
【解决方案2】:

因此,显然,根据计算机科学,递归函数可以转换为迭代循环,因此也许有一种方法可以在循环中完成您想要的。

另外,将不同的功能放入函数中通常更好,因为我喜欢递归函数匹配递归数据结构,这是我的解决方案。

请注意,您没有提供任何更新后数据结构的示例,所以我不得不猜测这部分。

这段代码:

def recursiveUpdate(target, keys, update):
    for k in target:
        if k in keys:
            v = target[k]
            if isinstance(v, dict):
                recursiveUpdate(v, keys, update)
            else:
                print(target[k], update[k])
                target[k] = update[k]
        else:
            v = target[k]
            if isinstance(v, dict):
                recursiveUpdate(v, keys, update)
                
my_dic = {
          'System Error': {
                           'Bit0': 'Out of Sync',
                           'Bit1': {
                                    'Sensor Error':{                                              
                                                    'Bit0': 'Out of Range Error',
                                                    'Bit1': 'Communication Error'
                                                   }
                                    },
                            'Bit2': 'System Unresponsive Error'
                            }
          }

new_dic = {'Bit0' : 'X', 'Bit1': 'Y', 'Bit2': 'Z'}

keys = list(new_dic.keys())
recursiveUpdate(my_dic, keys, new_dic)

print(my_dic)

产生这个输出:

{'System Error': {'Bit0': 'X', 'Bit1': {'Sensor Error': {'Bit0': 'X', 'Bit1': 'Y'}}, 'Bit2': 'Z'}}

【讨论】:

  • 谢谢。但我想要的是 'Sensor Error' 中的 'Bit0' 替换为 'new_dic'
  • 好的,但是为什么呢?都有些什么样的规矩? Bit1Bit2 呢?
  • 传感器错误中只有 Bit0 和 Bit1。我需要更改 Bit0 部分。 Bit0 现在将有一个字典(new_dic)作为值。 Sensor Error 中的 Bit0 是可变的,并且是从不同的文件中读取的。
  • 好的,那么我们如何告诉程序呢?
  • 我的问题很奇怪。 OP 试图达到的目标是什么,达到目标需要满足哪些标准。需要更换“传感器错误”中的 OP 如何到达“Bit0”。如果我们能理解这一点,那么我们可以帮助 OP。否则,我们将抓紧救命稻草。 :)
猜你喜欢
  • 2021-04-14
  • 1970-01-01
  • 2018-12-01
  • 2018-07-10
  • 1970-01-01
  • 2019-07-18
  • 2021-07-29
  • 2018-05-23
  • 1970-01-01
相关资源
最近更新 更多