我需要从列表中以树的形式构建字典。 前几个键是列表的最后一个元素。
current = [['A1'], ['B1', 'A1'], ['B2', 'A1'], ['C1', 'B2', 'A1'], ['D2', 'C1', 'B2', 'A1'], ['D1', 'C1', 'B2', 'A1'], ['A2']]
expected = {
'A1': {
'B1': None,
'B2': {
'C1': {
'D1': None,
'D2': None
},
},
},
'A2': None
}
我尝试使用默认字典进行某些操作,但是递归使其无法成功使用,我不知道这是否是正确的方法。
result = defaultdict(list)
for e in current:
result[e[-1]].append(e)
答案 0 :(得分:2)
这没有您想要的 None ,而是提供了空的 dict 对象。但是,它确实从提供的列表中形成了预期的树:
current = [['A1'], ['B1', 'A1'], ['B2', 'A1'], ['C1', 'B2', 'A1'], ['D2', 'C1', 'B2', 'A1'], ['D1', 'C1', 'B2', 'A1'], ['A2']]
tree = {}
for item in current:
currentdict = tree
for key in item[::-1]:
if key not in currentdict.keys():
currentdict[key] = {}
currentdict = currentdict[key]
expected = {
'A1': {
'B1': {},
'B2': {
'C1': {
'D1': {},
'D2': {}
},
},
},
'A2': {}
}
print(tree == expected) # True
答案 1 :(得分:-1)
这是一种方法。
首先,我们将从-> here
借用方法import pprint
from operator import getitem
from functools import reduce
def getdict(dict_, mappings):
return reduce(getitem, mappings, dict_)
def setdict(dict_, mappings):
getdict(dict_, mappings[:-1])[mappings[-1]] = dict()
d = dict()
for cur in current:
c = cur[::-1]
setdict(d, c)
pprint.pprint(d)
{'A1': {'B1': {}, 'B2': {'C1': {'D1': {}, 'D2': {}}}}, 'A2': {}}