如何在尚未存在的键下创建嵌套字典?

时间:2017-07-09 01:16:52

标签: python dictionary

我有一个空数组。

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

这会产生 KeyError ,因为数组[key]尚不存在。

我该怎么办?我试过以下......

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

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

我试过了:

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

TypeError:list indices必须是整数,而不是str

我试过了:

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

TypeError:list indices必须是整数,而不是str

那我该怎么办?

5 个答案:

答案 0 :(得分:12)

您可以使用here,将默认工厂作为dict传递:

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

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

array = {}

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

答案 3 :(得分:3)

你可以像这样使用嵌套的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

答案 4 :(得分:0)

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

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