创建嵌套字典一个班轮

时间:2018-05-10 19:06:19

标签: python dictionary

您好我有三个列表,我想使用一行创建一个三级嵌套字典。

即,

++ '[' '!' 1 -eq 0 ']'
++ [[ --t = \-\-\t\e\s\t ]]
++ [[ --t = \-\t ]]
++ [[ --t = \-\-\y\e\s\t\e\r\d\a\y ]]
++ [[ --t = \-\y ]]
++ '[' '!' 1 -eq 0 ']'
++ [[ --t = \-\-\t\e\s\t ]]
++ [[ --t = \-\t ]]
++ [[ --t = \-\-\y\e\s\t\e\r\d\a\y ]]
++ [[ --t = \-\y ]]
++ '[' '!' 1 -eq 0 ']'
++ [[ --t = \-\-\t\e\s\t ]]
++ [[ --t = \-\t ]]
++ [[ --t = \-\-\y\e\s\t\e\r\d\a\y ]]
++ [[ --t = \-\y ]]
++ '[' '!' 1 -eq 0 ']'
++ [[ --t = \-\-\t\e\s\t ]]
++ [[ --t = \-\t ]]
++ [[ --t = \-\-\y\e\s\t\e\r\d\a\y ]]
++ [[ --t = \-\y ]]

我想创建以下嵌套字典:

l1 = ['a','b']
l2 = ['1', '2', '3']
l3 = ['d','e']

我尝试使用zip来执行外部循环并添加列表但是元素被替换。即,这不起作用:

nd = {'a':{'1':{'d':0},{'e':0},'2':{'d':0},{'e':0},'3':{'d':0},{'e':0},'b':'a':{'1':{'d':0},{'e':0},'2':{'d':0},{'e':0},'3':{'d':0},{'e':0}}

2 个答案:

答案 0 :(得分:5)

zip不会在这里做。 zip连续迭代所有3个列表。你需要的是产品 - 有效的3个嵌套循环。您可以将这一点压缩成单个词典理解,但代价是可读性。

>>> {i : {j : {k : 0 for k in l3} for j in l2} for i in l1}

{'a': {'1': {'d': 0, 'e': 0}, 
       '2': {'d': 0, 'e': 0}, 
       '3': {'d': 0, 'e': 0}},
 'b': {'1': {'d': 0, 'e': 0}, 
       '2': {'d': 0, 'e': 0}, 
       '3': {'d': 0, 'e': 0}}
}

或者,如果你想要一个最底层的单键词典列表(正如你的o / p建议的那样),

>>> {i : {j : [{k : 0} for k in l3] for j in l2} for i in l1}

{'a': {'1': [{'d': 0}, {'e': 0}],
       '2': [{'d': 0}, {'e': 0}],
       '3': [{'d': 0}, {'e': 0}]},
 'b': {'1': [{'d': 0}, {'e': 0}],
       '2': [{'d': 0}, {'e': 0}],
       '3': [{'d': 0}, {'e': 0}]}
}

答案 1 :(得分:1)

您还可以使用更简单的循环来递归:

l1 = ['a','b']
l2 = ['1', '2', '3']
l3 = ['d','e']
def combinations(d):
  return {i:combinations(d[1:]) if d[1:] else 0 for i in d[0]}

print(combinations([l1, l2, l3]))

输出:

{'b': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}, 'a': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}}

编辑:true one-liner:

print((lambda d:{i:combination(d[1:]) if d[1:] else 0 for i in d[0]})([l1, l2, l3]))

输出:

{'b': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}, 'a': {'1': {'d': 0, 'e': 0}, '2': {'d': 0, 'e': 0}, '3': {'d': 0, 'e': 0}}}