提问人:Görkem Akıncı 提问时间:7/13/2023 更新时间:7/13/2023 访问量:43
如何从python字典中创建所有可能的路径?
How to create all paths possible from a python dictionary?
问:
我有一个 python 字典,我想从所有键值输出所有可能的路径。这是一个小规模的例子,可以直观地看到我正在尝试做的事情。
dictionary = {'parent':['child1','child2'], 'child1': ['child1_1','child1_2'], 'child2': ['child2_1','child2_2'], 'child3': [], 'child1_1'= ['child1_1_1', 'child1_1_2'], 'child1_1_1': [], 'child1_1_2': [], 'child1_2': [], 'child2_1': [], 'child2_2': [], 'child4'=[]}
我想要的输出是这样的:
父母/孩子1
父母/孩子1/child1_1
父母/孩子1/child1_1/child1_1_1
父母/孩子1/child1_1/child1_1_2
父母/孩子1/child1_2
父母/孩子2/child2_1
父母/孩子2/child2_2
父母/孩子3
父母/孩子4
.
.
.
请注意,我想将其用于更大的规模,因此使用 2 for 循环,我能够输出一个带有父级的路径和 2 个直接子级的路径。但它在更大范围内不起作用,我想我需要一个 for 循环,在 while true 循环中,我可以检查孩子是否没有任何孩子,它会输出我“嘿,我是最后一个剩下的,这是我可用的路径”等。
提前致谢,祝你有美好的一天。
答:
child3 和 child4 在父项中没有提到,那么如果我们忽略给出所需输出的函数是这样的,那么你想如何在输出中指向父项:
def get_paths(dictionary, parent="", paths=None):
if paths is None:
paths = []
paths.append(parent)
if parent in dictionary:
children = dictionary[parent]
for child in children:
child_paths = get_paths(dictionary, child)
paths.extend([f"{parent}/{path}" for path in child_paths])
return paths
dictionary = {
'parent': ['child1', 'child2'],
'child1': ['child1_1', 'child1_2'],
'child2': ['child2_1', 'child2_2'],
'child3': [],
'child1_1': ['child1_1_1', 'child1_1_2'],
'child1_1_1': [],
'child1_1_2': [],
'child1_2': [],
'child2_1': [],
'child2_2': [],
'child4': [],
}
paths = get_paths(dictionary, 'parent')
for path in paths:
print(path)
输出:
parent
parent/child1
parent/child1/child1_1
parent/child1/child1_1/child1_1_1
parent/child1/child1_1/child1_1_2
parent/child1/child1_2
parent/child2
parent/child2/child2_1
parent/child2/child2_2
评论
您可以使用递归函数来执行此操作。
d = {'parent':['child1','child2'], 'child1': ['child1_1','child1_2'], 'child2': ['child2_1','child2_2'], 'child3': [], 'child1_1': ['child1_1_1', 'child1_1_2'], 'child1_1_1': [], 'child1_1_2': [], 'child1_2': [], 'child2_1': [], 'child2_2': [], 'child4': []}
def print_children(parent, parent_path):
for child in d[parent]:
child_path = f"{parent_path}/{child}"
print(child_path)
print_children(child, child_path)
print_children("parent", "parent")
输出:
parent/child1
parent/child1/child1_1
parent/child1/child1_1/child1_1_1
parent/child1/child1_1/child1_1_2
parent/child1/child1_2
parent/child2
parent/child2/child2_1
parent/child2/child2_2
如@OmidRoshani所述,如果希望将 child3 和 child4 包含在输出中,则需要将它们添加到父级中。
评论