我正在创建一个有几个层次的字典结构。我正在尝试执行以下操作:
dict = {}
dict['a']['b'] = True
目前上述失败,因为键'a'不存在。目前我必须检查每一层嵌套并手动插入一个空字典。是否有某种类型的语法糖可以做类似上面的事情可以产生:
{'a': {'b': True}}
无需在每个嵌套级别创建一个空字典?
我正在创建一个有几个层次的字典结构。我正在尝试执行以下操作:
dict = {}
dict['a']['b'] = True
目前上述失败,因为键'a'不存在。目前我必须检查每一层嵌套并手动插入一个空字典。是否有某种类型的语法糖可以做类似上面的事情可以产生:
{'a': {'b': True}}
无需在每个嵌套级别创建一个空字典?
正如其他人所说,使用defaultdict
. 这是我喜欢任意深度嵌套字典的习语:
def nested_dict():
return collections.defaultdict(nested_dict)
d = nested_dict()
d[1][2][3] = 'Hello, dictionary!'
print(d[1][2][3]) # Prints Hello, dictionary!
这也使得检查元素是否存在变得更好,因为您可能不再需要使用get
:
if not d[2][3][4][5]:
print('That element is empty!')
这已被编辑为使用 adef
而不是 lambda 来实现pep8 合规性。原始的 lambda 形式如下所示,它的缺点是在<lambda>
任何地方都被调用,而不是获得正确的函数名称。
>>> nested_dict = lambda: collections.defaultdict(nested_dict)
>>> d = nested_dict()
>>> d[1][2][3]
defaultdict(<function <lambda> at 0x037E7540>, {})
或者你可以这样做,因为dict()
函数可以处理**kwargs
:
http://docs.python.org/2/library/functions.html#func-dict
print dict(a=dict(b=True))
# {'a': {'b' : True}}
如果你的数据结构的深度是固定的(也就是说,你事先知道你需要mydict[a][b][c]
但不需要mydict[a][b][c][d]
),你可以使用表达式构建一个嵌套的 defaultdict 结构lambda
来创建内部结构:
two_level = defaultdict(dict)
three_level = defaultdict(lambda: defaultdict(dict))
four_level = defaultdict(lamda: defaultdict(lambda: defaultdict(dict)))