python - 如何在 python 字典中保持循环以搜索值?
问题描述
parent = {'Amy':'Ben', 'May':'Tom', 'Tom':'Ben',
'Ben':'Howard', 'Howard':'George', 'Frank':'Amy',
'Joe':'Bill', 'Bill':'Mary', 'Mary':'Philip', 'Simon':'Bill',
'Zoe':'Mary'}
这是问题中提到的父字典。我的任务是:
找出输入的 2 个名称是否是祖先。例如,Amy 的父母是 Ben,Ben 的父母是 Howard,因此 Howard 和 Amy 作为祖先有血缘关系。
下面是我的代码:
def is_ancestor(name1,name2,pdict):
for name in pdict:
parent = pdict.get(name2)
parent2 = pdict.get(parent)
if(name1 == parent2):
return True
else:
return False
这将适用于我上面提到的示例案例。但是如果问题是“艾米”和“霍华德”呢?它应该返回 True,因为“Amy”的父母是“Tom”,Tom 的父母是 Ben,Ben 的父母是 Howard。所以艾米和霍华德是祖先。但是我的代码会在得到汤姆和本之后停止。如何让它循环直到我遇到正确的答案?
以下是确切的问题:
如果人 B 被认为是人 A 的众多后代之一,那么人 A 是人 B 的(间接)祖先。
在上面给出的示例祖先树中,霍华德是艾米的祖先,但艾米不是汤姆的祖先。
而那个人本身并不是他自己的祖先。你的任务是编写一个函数,
is_ancestor(name1,name2,pdict)
,它接受三个参数。前两个参数是人名(字符串),而第三个参数是
上面提到的父字典。如果参数列表中的第一个人是第二个人的祖先,则该函数应返回布尔值“True”,
如果参数列表中的第一个人不是第二个人的祖先,则为“假” 。
解决方案
这是您使用递归的答案:
def is_ancestor(name1, name2, pdict):
try:
if pdict[name1] == name2:
return True
else:
return is_ancestor(pdict[name1], name2, pdict)
except KeyError:
return False
首先,它检查它是否找到了直接祖先,如果没有,则通过递归相同的函数来检查下一代。如果未找到祖先,则会触发 KeyError 异常,表明它name2
不是name1
.
推荐阅读
- javascript - 角度控制流:在函数调用完成之前执行的返回语句
- system-verilog - 在 SystemVerilog 中包含警卫
- string - 如何将字符串转换为 Double Microsoft VBScript
- javascript - 在 Typescript 中使用 React Props 的传播运算符(错误:...可以用不同的约束子类型 {} 实例化)
- c++ - 为什么有时使用基本类型作为基类编译?
- android - Flutter - 无法构建插件 firebase_core
- python - 当 break 不起作用时如何停止循环?
- java - 使用迭代器第二次调用方法抛出 ConcurrentModificationException
- java - mongodb获取两个日期范围内的所有文档
- c - 为什么当我有一个特定的尺寸时我会把两条线合二为一