迭代列表以创建父/子词典[关闭]

问题描述 投票:-4回答:1

假设我有以下列表:

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])

但它不会产生所需的输出

python dictionary
1个回答
1
投票

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

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

如果没有订购父母和孩子,即孩子可以在其父母之前出现,则必须与3分开建立1.和2.否则,您可以一次性完成所有数据。请注意,您可以在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

如果没有订购父母和孩子,就属于这种情况。您必须单独初始化translation(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.
© www.soinside.com 2019 - 2024. All rights reserved.