假设我有以下列表:
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])
但它不会产生所需的输出
假设每个名称只属于一个键,并且在子项之前定义了父项,则需要为每个元素执行三个任务:
如果没有订购父母和孩子,即孩子可以在其父母之前出现,则必须与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.