📜  Python|将列表列表转换为树状字典

📅  最后修改于: 2022-05-13 01:55:00.398000             🧑  作者: Mango

Python|将列表列表转换为树状字典

给定一个列表列表,编写一个Python程序将给定的列表列表转换为树状字典。

例子:

Input : [[1], [2, 1], [3, 1], [4, 2, 1], [5, 2, 1], [6, 3, 1], [7, 3, 1]]
Output : {1: {2: {4: {}, 5: {}}, 3: {6: {}, 7: {}}}}

Input : [['A'], ['B', 'A'], ['C', 'A'], ['D', 'C', 'A']]
Output : {'A': {'C': {'D': {}}, 'B': {}}}


方法#1:朴素的方法
这是一种朴素的方法,我们使用两个 for 循环来遍历列表。我们将空字典“树”初始化为currTree ,并且每次我们检查键(列表项的列表)是否包含在currTree中。如果没有,请将其包含在currTree中,否则什么也不做。最后,将currTree[key]分配给currTree

# Python3 program to Convert a list
# of lists into Dictionary (Tree form)
  
def formTree(list):
    tree = {}
    for item in list:
        currTree = tree
  
        for key in item[::-1]:
            if key not in currTree:
                currTree[key] = {}
            currTree = currTree[key]
              
    return tree
  
# Driver Code
lst = [['A'], ['B', 'A'], ['C', 'A'], ['D', 'C', 'A']]
print(formTree(lst))
输出:
{'A': {'B': {}, 'C': {'D': {}}}}


方法 #2:使用reduce()
reduce()函数用于将在其参数中传递的特定函数应用于传递的序列中提到的所有列表元素。我们将使用reduce()遍历字典并重用getTree()来找到存储setTree()值的位置。 mapList中除了最后一个元素之外的所有元素都需要找到“父”字典来添加值,然后使用最后一个元素将值设置为正确的键。

# Python3 program to Convert a list
# of lists into Dictionary (Tree form)
  
from functools import reduce
from operator import getitem
  
def getTree(tree, mappings):
    return reduce(getitem, mappings, tree)
      
def setTree(tree, mappings):
    getTree(tree, mappings[:-1])[mappings[-1]] = dict()
  
# Driver Code
lst = [['A'], ['B', 'A'], ['C', 'A'], ['D', 'C', 'A']]
tree ={}
for item in lst:
    setTree(tree, item[::-1])
  
print(tree)
输出:
{'A': {'B': {}, 'C': {'D': {}}}}