我试图从列表中创建/填充嵌套字典。
例如,列表[['a','b','c'],value]
可以创建:
data['a']['b']['c'] = value
给我一本字典:
{ 'a': { 'b': { 'c' : value } } }
所有人都非常感谢。
答案 0 :(得分:3)
的Python:
l = [['a', 'b', 'c'], 'foo']
d = l[1]
for k in l[0][::-1]:
d = {k : d}
print d
输出:
{'a': {'b': {'c': 'foo'}}}
答案 1 :(得分:3)
(假设您有多个多键/值对。)
您可以使用setdefault
为所有子键添加嵌套词典,除非它们已经存在,每次继续使用除最后一个子键之外的所有子键。然后将值放入最里面的字典中。
def add_nested(d, keys, value):
for k in keys[:-1]:
d = d.setdefault(k, {})
d[keys[-1]] = value
示例:
values = [
[['a','b','c'], 1],
[['a','b','d'], 2],
[['a','e','f'], 3]]
result = {}
for keys, value in values:
add_nested(result, keys, value)
print(result)
结果:
{'a': {'b': {'c': 1, 'd': 2}, 'e': {'f': 3}}}
或者,您也可以使用优质的infinite dictionary:
infinidict = lambda: collections.defaultdict(infinidict)
result = infinidict()
for keys, value in values:
last = reduce(operator.getitem, keys[:-1], result)
last[keys[-1]] = value
答案 2 :(得分:0)
使用生成器和递归样式:
a = [
[['a','b','c'],1],
[['c','d'],1],
]
def l2d(a):
def mkd(k,v):
if not k:
return v
return {k[0]:mkd(k[1:],v)}
for k, v in a:
yield mkd(k,v)
for d in l2d(a):
print d
结果:
>>>
{'a': {'b': {'c': 1}}}
{'c': {'d': 1}}