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

Gra*_*ams 3 python dictionary

我有一个空数组.

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

这会产生KeyError,因为array [key]尚不存在.

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

array['key'] = None
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)

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

我试过了:

array['key'] = []
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)

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

我试过了:

array['key'] = ['subkey']
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)

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

那我该怎么办?

Mos*_*oye 16

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

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

要应用嵌套的进一步水平,你可以创建一个defaultdict返回defaultdicts到一个第n个嵌套的深度,使用功能,最好是匿名的,返回嵌套默认的字典(S):

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

示例显示了嵌套深度 n=1


ACh*_*ion 5

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

array['key'] = {}
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)

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

if 'key' not in array:
    array['key'] = {}
array['key']['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)

但是,如果它还没有值,你可以使用setdefault()同样的东西并给出key一个默认值,例如:

array.setdefault('key', {})['subkey'] = 'value'
Run Code Online (Sandbox Code Playgroud)

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