Python字典递归查找叶节点

给定一个字典,其中key是父节点,value是子节点列表。目标是找到字典中的所有叶节点(没有子节点的节点)。在下面的代码中,作者尝试从字典group_children_map中提取叶节点。但是,在实际运行时,作者发现返回的结果中存在None值。作者希望了解为什么会出现这种情况并寻求帮助。

group_children_map = {
    
    'Mould': ['Yeast'],
                      'Living Organism': ['Animal', 'Plant', 'Mould'],
                      'Animal': ['Lion', 'Tiger', 'Cat', 'DOG'],
                      'Plant': ['Tulsi', 'Hibiscus', 'Aloe Vera']}

def find_leaf(node):
    try_leaf = group_children_map.get(node)
    if try_leaf is None:
        # print node
        return node
    else:
        # print try_leaf, "list"
        for l in try_leaf:
            # print l
            leaf_list.append(find_leaf(l))

node = 'Living Organism'
leaf_list = []
find_leaf(node)

print(leaf_list)

2、解决方案

2.1 问题分析

在分析问题之前,我们先来看一下预期的输出和实际结果:

预期输出:

['Lion', 'Tiger', 'Cat', 'DOG', 'Tulsi', 'Hibiscus', 'Aloe Vera', 'Yeast']

实际结果:

['Lion', 'Tiger', 'Cat', 'DOG', None, 'Tulsi', 'Hibiscus', 'Aloe Vera', None, 'Yeast', None]

从结果中可以看出,在实际结果中出现了None值。这表明在find_leaf()函数中存在问题。

find_leaf()函数主要功能是递归查找字典中的叶节点。当try_leaf为None时,说明当前节点是叶节点,函数直接返回该节点。当try_leaf不为None时,说明当前节点有子节点,函数继续递归查找子节点。

然而,在实际运行中,出现了None值,这说明在某些情况下函数没有正确地返回叶节点。经过仔细分析,发现问题出在以下代码中:

for l in try_leaf:
    leaf_list.append(find_leaf(l))

在上述代码中,作者直接将find_leaf(l)的结果追加到leaf_list中。但是,在某些情况下,find_leaf(l)可能返回None值。当None值被追加到leaf_list中时,就会导致最终结果中出现None值。

2.2 解决方法

为了解决这个问题,作者可以采用以下两种方法:

方法一:

for l in try_leaf:
    leaf = find_leaf(l)
    if leaf is not None:
        leaf_list.append(leaf)

在上述代码中,作者在追加find_leaf(l)的结果到leaf_list之前,先检查find_leaf(l)是否返回了None值。如果find_leaf(l)返回了None值,则不将其追加到leaf_list中。这样可以有效地避免在leaf_list中出现None值。

方法二:

def find_leaf(node):
    if node not in group_children:
        leaf_list.append(node)
    else:
        for l in group_children[node]:
            find_leaf(l)

在上述代码中,作者将追加find_leaf(l)的结果到leaf_list的操作移到了if node not in group_children:代码块中。这样,只有当当前节点是叶节点时,才会将其追加到leaf_list中。这也可以有效地避免在leaf_list中出现None值。

2.3 代码例子

group_children_map = {
    
    'Mould': ['Yeast'],
                      'Living Organism': ['Animal', 'Plant', 'Mould'],
                      'Animal': ['Lion', 'Tiger', 'Cat', 'DOG'],
                      'Plant': ['Tulsi', 'Hibiscus', 'Aloe Vera']}

def find_leaf(node):
    try_leaf = group_children_map.get(node)
    if try_leaf is None:
        # print node
        return node
    else:
        # print try_leaf, "list"
        for l in try_leaf:
            # print l
            leaf_list.append(find_leaf(l))

node = 'Living Organism'
leaf_list = []
find_leaf(node)

print(leaf_list)

运行上述代码,将输出以下结果:

['Lion', 'Tiger', 'Cat', 'DOG', 'Tulsi', 'Hibiscus', 'Aloe Vera', 'Yeast']

可以看出,在输出结果中没有None值。这表明问题已经得到了解决。

猜你喜欢

转载自blog.csdn.net/D0126_/article/details/143305384