19

我正在创建一个有几个层次的字典结构。我正在尝试执行以下操作:

dict = {}
dict['a']['b'] = True

目前上述失败,因为键'a'不存在。目前我必须检查每一层嵌套并手动插入一个空字典。是否有某种类型的语法糖可以做类似上面的事情可以产生:

{'a': {'b': True}}

无需在每个嵌套级别创建一个空字典?

4

4 回答 4

33

正如其他人所说,使用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>, {})
于 2013-05-23T22:28:26.557 回答
1

使用defaultdict.

Python:defaultdict的defaultdict?

于 2013-05-23T22:19:43.297 回答
0

或者你可以这样做,因为dict()函数可以处理**kwargs

http://docs.python.org/2/library/functions.html#func-dict

print dict(a=dict(b=True))
# {'a': {'b' : True}}
于 2013-05-23T22:24:53.477 回答
0

如果你的数据结构的深度是固定的(也就是说,你事先知道你需要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)))
于 2013-05-23T22:30:40.847 回答