首页 > 解决方案 > 如何在 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”,


如果参数列表中的第一个人不是第二个人的祖先,则为“假” 。

标签: pythonpython-3.x

解决方案


这是您使用递归的答案:

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.


推荐阅读