从列表中构建树

时间:2019-02-11 13:26:43

标签: python python-3.x

我需要从列表中以树的形式构建字典。 前几个键是列表的最后一个元素。

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)

2 个答案:

答案 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': {}}