我有如下嵌套列表:
[['A', 'A1'], ['A1', 'B', 'C'], ['B', 'B1', 'B2'], ['B1', 'b1', 'b2', 'b3',
'B2', 'd1', 'd2', 'd3', 'd4'], ['C', 'C1', 'C2', 'C3'], ['C1', 'a1', 'a2', 'a3','C2', 'n1', 'n2', 'n3', 'n4','C3', 'x1', 'x2', 'x3', 'x4']]
我想创建嵌套字典,如:
{'A': {'A1': {'B': {'B1': {'b1': {}, 'b2': {}, 'b3': {}},
'B2': {'d1': {}, 'd2': {}, 'd3': {}, 'd4': {}}},
'C': {'C1': {'a1': {}, 'a2': {}, 'a3': {}},
'C2': {'n1': {}, 'n2': {}, 'n3': {}, 'n4': {}},
'C3': {'x1': {}, 'x2': {}, 'x3': {}, 'x4': {}}}}}}
或:
{'A': {'A1': {'B': {'B1': ['b1', 'b2' 'b3', 'b4'],
'B2': ['d1', 'd2', 'd3', 'd4']},
'C': {'C1': ['a1', 'a2', 'a3'],
'C2': ['n1', 'n2', 'n3', 'n4'],
'C3': ['x1', 'x2', 'x3', 'x4']}}}
我尝试过类似的方法。
d = {}
for path in in nested_list:
current_dict = d
for part in path:
if part not in current_ dict:
current_dict [part]={}
但未获得理想的结果
示例文件
[1.txt](https://i.stack.imgur.com/dIYmb.jpg[2.txt(https://i.stack.imgur.com/brDUz.jpg)[3.txt(https://i.stack.imgur.com/HaTwd.jpg) 4.txt 5.txt
答案 0 :(得分:2)
编辑说明:在我给出此答案后,您已更改了问题的输入内容。以下解决方案适用于您的旧输入,其中列表列表为:
[['A', 'A1'], ['A1', 'B', 'C'], ['B', 'B1', 'B2'], ['B1', 'b1', 'b2', 'b3'],
['B2', 'd1', 'd2', 'd3', 'd4'], ['C', 'C1', 'C2', 'C3'], ['C1', 'a1', 'a2', 'a3'],
['C2', 'n1', 'n2', 'n3', 'n4'], ['C3', 'x1', 'x2', 'x3', 'x4']]
假设列表列表存储在变量l
中,则可以使用以下for
循环使用字典映射p
来构建所需字典,以跟踪父节点每个键:
d = {}
p = {}
for k, *s in l:
r = p.get(k, d)[k] = {i: {} for i in s}
p.update({i: r for i in s})
d
将变为:
{'A': {'A1': {'B': {'B1': {'b1': {}, 'b2': {}, 'b3': {}},
'B2': {'d1': {}, 'd2': {}, 'd3': {}, 'd4': {}}},
'C': {'C1': {'a1': {}, 'a2': {}, 'a3': {}},
'C2': {'n1': {}, 'n2': {}, 'n3': {}, 'n4': {}},
'C3': {'x1': {}, 'x2': {}, 'x3': {}, 'x4': {}}}}}}
要使叶节点成为列表,可以从下至上遍历树,并使用集合m
来跟踪子节点,以便可以使用集合差异找到要添加的所有顶部节点最后到主字典d
:
p = {}
m = set()
while l:
k, *s = l.pop()
p[k] = {i: p[i] for i in s} if all(i in p for i in s) else s
m.update(s)
d = {i: p[i] for i in p.keys() - m}
d
将变为:
{'A': {'A1': {'B': {'B1': ['b1', 'b2', 'b3'],
'B2': ['d1', 'd2', 'd3', 'd4']},
'C': {'C1': ['a1', 'a2', 'a3'],
'C2': ['n1', 'n2', 'n3', 'n4'],
'C3': ['x1', 'x2', 'x3', 'x4']}}}}