我有以下Python列表:
[
['a.b.c.d.e.rollover', 0],
['a.b.c.d.e.f.rollover', 1],
['a.b.c.d.e.g.rollover', 0]
]
Run Code Online (Sandbox Code Playgroud)
假设这个列表非常大(很多元素!)
Python中是否有一种有效的方法将其转换为如下所示的多级字典?
{
'a': {
'b': {
'c': {
'd': {
'e': {
'rollover': 0,
'f': {
'rollover': 1
}
'g': {
'rollover': 0
}
}
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以使用defaultdict与使用相同的lambda返回:defaultdictlambda
from collections import defaultdict
l = [
['a.b.c.d.e.rollover', 0],
['a.b.c.d.e.f.rollover', 1],
['a.b.c.d.e.g.rollover', 0]
]
dd = lambda: defaultdict(dd)
res = dd()
for k, v in l:
d = res
keys = k.split('.')
# Add all the keys except the last one, d[x] will do since
# it forces default value to be generated
for x in keys[:-1]:
d = d[x]
# Assign value to last key
d[keys[-1]] = v
print res['a']['b']['c']['d']['e']['rollover'] # 0
print res['a']['b']['c']['d']['e']['f']['rollover'] # 1
Run Code Online (Sandbox Code Playgroud)
简短说明:为了defaultdict在键不存在的情况下自动生成新的,我们需要一个lambda返回这样一个对象的函数(或).由于defaultdict构造函数需要一个参数,我们必须提供一个传递参数的函数defaultdict.每次取消引用不存在的键时defaultdict,都会调用该函数,并创建一个新的,如果需要,将来会再次调用相同的函数.这称为自动更新.