2016-09-27 45 views
1

为什么下面的工作嵌套defaultdicts

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

因为'defaultdict(dict)'只适用于两层嵌套?内部字典'd [a]'只是一个香草字典。 – jonrsharpe

+0

@DanielLee那是不正确的;它只修复了部分问题 – jonrsharpe

+0

如果你需要深入三层使用'defaultdict(lambda:defaultdict(dict))'。 –

回答

1

的这里的问题是,defaultdict接受一个可调用的,它被用作工厂时产生的关键是缺少价值。一旦你明白,行为是明确的:

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! 

如果你只需要嵌套的有限水平,使用普通的老dicttuple键通常是一个更容易的数据结构一起工作。这对您问题中显示的二维和三维示例都可以正常工作。

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