假设我有以下列表:
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])
但是它没有产生所需的输出
答案 0 :(得分:1)
假设每个名称仅属于一个键,并且在孩子之前定义了父母,则需要为每个元素执行三个任务:
如果未下令父母和孩子,即孩子可以出现在其父母之前,则必须分别构建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.