【问题标题】:How to correctly update the values of list types in a Python nested dictionary?如何正确更新 Python 嵌套字典中列表类型的值?
【发布时间】:2021-11-05 02:15:47
【问题描述】:

情况是我想构建一个嵌套字典,其结构如下

{'a': {'1': [], '2': [], '3': [], '4': []},
 'b': {'1': [], '2': [], '3': [], '4': []},
 'c': {'1': [], '2': [], '3': [], '4': []}}

起始部分是

keys = ['a','b','c']
subkeys = ['1','2','3','4']
target_dict = dict.fromkeys(keys, {key: [] for key in subkeys})

然后,我想更新一个子键的值,例如target_dict['a']['1'] = 1,我只想将条目“a-1”设置为 1,而将其他值留空。但是,“a-1”、“b-1”和“c-1”都同时更新。导致结果为

{'a': {'1': 1, '2': [], '3': [], '4': []},
 'b': {'1': 1, '2': [], '3': [], '4': []},
 'c': {'1': 1, '2': [], '3': [], '4': []}}

这种情况的原因是什么,我应该如何解决?谢谢。

【问题讨论】:

  • 这能回答你的问题吗? Changing list in dictionary changes all lists
  • 基本上,不要将可变对象与dict.fromkeys()一起使用
  • 考虑阅读标准库中collections 模块中的defaultdict。在这里可能会有所帮助。

标签: python python-3.x list dictionary


【解决方案1】:

问题在于 target_dict['a'] target_dict['b']target_dict['c'] 似乎保持相同的引用。尝试将您的代码更改为

target_dict = {k: {key: [] for key in subkeys} for k in keys}

【讨论】:

    【解决方案2】:

    您为每个键赋予了相同的对象(字典)作为值。无论您使用哪个键来访问和修改字典,都只有一个字典,因此它会反映到所有其他键。

    为每个键创建一个字典可以解决问题:

    >>> keys = ['a','b','c']
    >>> subkeys = ['1','2','3','4']
    >>> target_dict = {key: {subkey: [] for subkey in subkeys} for key in keys}
    >>> target_dict
    {'a': {'1': [], '2': [], '3': [], '4': []}, 'b': {'1': [], '2': [], '3': [], '4': []}, 'c': {'1': [], '2': [], '3': [], '4': []}}
    >>> target_dict['a']['1'].append(1)
    >>> target_dict
    {'a': {'1': [1], '2': [], '3': [], '4': []}, 'b': {'1': [], '2': [], '3': [], '4': []}, 'c': {'1': [], '2': [], '3': [], '4': []}}
    

    【讨论】:

      猜你喜欢
      • 2016-01-11
      • 1970-01-01
      • 2021-08-20
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-21
      相关资源
      最近更新 更多