嵌套的默认值

时间:2016-09-27 12:54:11

标签: python python-2.7

为什么以下工作

x = defaultdict(dict)
for a,b,c in [('eg', 'ef', 'ee'), ('eg', 'eu', 'e4'), ('kk', 'nn', 'bb')]:
    x[a][b] = c

以下引发错误?

x = defaultdict(dict)
for a,b,c,d in [('eg', 'ef', 'ee', 'gg'), ('eg', 'eu', 'e4', 'hh'),
                ('kk', 'nn', 'bb', 'ff')]:
    x[a][b][c] = d

1 个答案:

答案 0 :(得分:1)

这里的问题是defaultdict接受一个callable,当一个键丢失时,它被用作工厂来生成值。一旦你理解了这一点,行为就很明确了:

x = defaultdict(dict)
x                    # it's a default dict
x['a']               # it's just a dict()
x['a']['b'] = 'c'    # it's just setting the 'b' item in the dict x['a']
x['a']['b']['z']     # oops, error, because x['a']['b'] is not a dict!

如果您只需要有限级别的嵌套,那么使用带有dict键的普通旧tuple通常可以使用更简单的数据结构。这对于您的问题中显示的2-d和3-d示例都可以正常工作。

但是,如果您需要任意级别的嵌套,则可以考虑显示here的递归defaultdict示例。