【问题标题】:How do I create a nested dictionary under a key that is yet to exist?如何在尚不存在的键下创建嵌套字典?
【发布时间】:2026-01-07 06:00:01
【问题描述】:

我有一个空数组。

我想分配一个像这样的值:array[key][subkey] = 'value'

这会产生一个 KeyError,因为 array[key] 还不存在。

我该怎么办?我尝试了以下...

array['key'] = None
array['key']['subkey'] = 'value'

TypeError: 'NoneType' 对象不支持项目分配

我试过了:

array['key'] = []
array['key']['subkey'] = 'value'

TypeError: 列表索引必须是整数,而不是 str

我试过了:

array['key'] = ['subkey']
array['key']['subkey'] = 'value'

TypeError: 列表索引必须是整数,而不是 str

那我该怎么办?

【问题讨论】:

  • 你的意思是嵌套字典?
  • @MosesKoledoye 是的

标签: python dictionary


【解决方案1】:

您可以使用collections.defaultdict,将默认工厂传递为dict

>>> from collections import defaultdict
>>> d = defaultdict(dict)
>>> d['key']['subkey'] = 'value'
>>> d
defaultdict(<type 'dict'>, {'key': {'subkey': 'value'}})

要应用更多级别的嵌套,您可以创建一个defaultdict,它会将defaultdicts 返回到嵌套深度n-th,使用函数(最好是匿名的)返回嵌套的默认字典:

>>> d = defaultdict(lambda: defaultdict(dict))
>>> d['key']['subkey']['subsubkey'] = 'value'
>>> d
defaultdict(<function <lambda> at 0x104082398>, {'key': defaultdict(<type 'dict'>, {'subkey': {'subsubkey': 'value'}})})

示例显示嵌套深度n=1

【讨论】:

    【解决方案2】:

    您使用的是 [] 列表文字而不是 {} 字典文字:

    array['key'] = {}
    array['key']['subkey'] = 'value'
    

    但这在循环中不是很有用。
    在一个循环中,您可以测试 'key' 是否不在 array 中 - 这是一个便宜的操作(O(1) 查找):

    if 'key' not in array:
        array['key'] = {}
    array['key']['subkey'] = 'value'
    

    但是你可以使用setdefault() 来做同样的事情,如果key 还没有值,你可以给它一个默认值,例如:

    array.setdefault('key', {})['subkey'] = 'value'
    

    如果这看起来很难看,那么您可以随时使用collection.defaultdict

    【讨论】:

      【解决方案3】:

      我以前使用过这种替代方式(编辑:虽然我更喜欢 Moses Koledoye 的回答):

      array = {}
      
      try:
          array[key][subkey] = 'value'
      except KeyError:
          array[key] = {}
          array[key][subkey] = 'value'
      

      【讨论】:

        【解决方案4】:

        您可以像这样使用嵌套的defaultdict,自动任意深度:

        >>> from collections import defaultdict
        >>> def ndd():
                return defaultdict(ndd)
        
        >>> array = ndd()
        >>> array['key']['subkey']['subsubkey'] = 'value'
        >>> array
        defaultdict(<function ndd at 0x041AC270>,
                    {'key': defaultdict(<function ndd at 0x041AC270>,
                                        {'subkey': defaultdict(<function ndd at 0x041AC270>,
                                                               {'subsubkey': 'value'})})})
        

        (为了便于阅读,我将输出缩进。)

        原来看到from severb

        【讨论】:

          【解决方案5】:

          下面的代码可以用作不同的方法吗?

          >>> array = {}
          >>> array["key"] = {"subkey": "value"}
          >>> array
          {'key': {'subkey': 'value'}}
          >>> 
          

          【讨论】:

          • 我用过它的地方(在循环内创建字典)这不是一个选项,因为它不会“填充”字典,而是创建一个新字典。