如何从python字典中创建所有可能的路径?

How to create all paths possible from a python dictionary?

提问人:Görkem Akıncı 提问时间:7/13/2023 更新时间:7/13/2023 访问量:43

问:

我有一个 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 循环中,我可以检查孩子是否没有任何孩子,它会输出我“嘿,我是最后一个剩下的,这是我可用的路径”等。

提前致谢,祝你有美好的一天。

python 循环 字典 for-loop while 循环

评论


答:

3赞 Omid Roshani 7/13/2023 #1

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

评论

0赞 Görkem Akıncı 7/13/2023
非常感谢您提供的非常有用的代码。是的,这是我对 child3 和 child4 的坏事,我只是脑死亡了一秒钟,在我原来的字典中,child3 和 child4 实际上是 child1 和 child2 的孩子。因此,它运行良好,为我节省了大量时间。此外,我花了一个小时搜索了 stackoverflow 和 web 来寻找这样的东西,我相信它也会对其他人有所帮助!
1赞 Omid Roshani 7/13/2023
@EdizGörkemAk没问题,我很高兴它帮助了你......
2赞 Jack Taylor 7/13/2023 #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 包含在输出中,则需要将它们添加到父级中。

评论

1赞 Görkem Akıncı 7/13/2023
非常感谢您提供的非常有用的代码。是的,这是我对 child3 和 child4 的坏事,我只是脑死亡了一秒钟,在我原来的字典中,child3 和 child4 实际上是 child1 和 child2 的孩子。因此,它运行良好,为我节省了大量时间。此外,我花了一个小时搜索了 stackoverflow 和 web 来寻找这样的东西,我相信它也会对其他人有所帮助!