遍历列表以创建父/子字典

时间:2018-07-28 08:55:13

标签: python dictionary

假设我有以下列表:

l = [['01', 'pharma', 'P'],['02', 'y', '01'],['03', 'x', '01'],['05', 'z', '03']]

,其中每个嵌套列表中的元素分别是key,name和parent_key。如果parent_key为'P',则表示它是祖父母。

示例:

['02','y','01']中的第三个元素是'01'是'y'的parent_key,这意味着它是'pharma'的子代,其键名是'01'。

我想创建一个父/子词典,可以查询以打印以下内容:

pharma
 x
  z
 y

其中“ pharma”是父代,“ x”和“ y”是“ pharma”的子代,“ z”是“ x”的子代。每个孩子都比其父母缩进一个空格。

我尝试过的是:

from collections import defaultdict
d = defaultdict(list)
for i in l:
    d[i[0]] = []
    if i[2] in d.keys():
        d[i[2]].append(i[1])

但是它没有产生所需的输出

1 个答案:

答案 0 :(得分:1)

假设每个名称仅属于一个键,并且在孩子之前定义了父母,则需要为每个元素执行三个任务:

  1. 将其名称映射到尚未完成的子列表
  2. 将其ID映射到其名称
  3. 将其链接到其父项

如果未下令父母和孩子,即孩子可以出现在其父母之前,则必须分别构建1.和2.与3。 否则,您可以一站式处理数据。请注意,您可以在for循环中解构元素,而不是索引元素。

key2name = {}
name2children = {}
for key, name, parent in l:
    name2children[name] = []  # 1.
    key2name[key] = name      # 2.
    if parent != 'P':         # root node has no parent
        name2children[key2name[parent]].append(name) # 3.

对于您的示例,这将产生结构

{'pharma': ['y', 'x'], 'x': ['z'], 'y': [], 'z': []}

请注意,您的数据未按 进行排序以匹配所需的输出!


通过走这棵树,您可以根据需要漂亮地打印出来。如果您不关心订购,可以放弃sorted通话。

def printwalk(node, indent=0):
    print(' '*indent, node)
    for child in sorted(name2children[node]):
        printwalk(child, indent+1)
printwalk('pharma')
# pharma
#  x
#   z
#  y

如果不下令父母和孩子,就是这种情况。您必须分别初始化翻译(1)和parent-> child(2)容器。

key2name = {}
name2children = {}
for key, name, _ in l:
    name2children[name] = []  # 1.
    key2name[key] = name      # 2.

for key, name, parent in l:
    if parent != 'P':         # root node has no parent
        name2children[key2name[parent]].append(name) # 3.