给定一个字典,其中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值。这表明问题已经得到了解决。