Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 美族最低共同祖先_Python_Algorithm_Graph_Beautifulsoup - Fatal编程技术网

Python 美族最低共同祖先

Python 美族最低共同祖先,python,algorithm,graph,beautifulsoup,Python,Algorithm,Graph,Beautifulsoup,Python的BeautifulSoup库是否有任何函数可以获取节点列表并返回最低的公共祖先 如果没有,你们有谁实现过这样的功能并愿意分享吗?我想这就是你们想要的,link1是一个元素,link2是另一个元素 link_1_parents = list(link1.parents)[::-1] link_2_parents = list(link2.parents)[::-1] common_parent = [x for x,y in zip(link_1_parents, link_2_p

Python的BeautifulSoup库是否有任何函数可以获取节点列表并返回最低的公共祖先


如果没有,你们有谁实现过这样的功能并愿意分享吗?

我想这就是你们想要的,link1是一个元素,link2是另一个元素

link_1_parents = list(link1.parents)[::-1]
link_2_parents = list(link2.parents)[::-1]

common_parent = [x for x,y in zip(link_1_parents, link_2_parents) if x is y][-1]

print common_parent
print common_parent.name

它将基本上从根向下遍历两个元素的父元素,并返回最后一个公共元素。

如果输入列表中的标记到最低公共祖先的距离对于输入中的每个节点都不完全相同,则接受的答案不起作用

它还使用每个节点的每个祖先,这是不必要的,在某些情况下可能非常昂贵

import collections
def lowest_common_ancestor(parents=None, *args):
    if parents is None:
        parents = collections.defaultdict(int)
    for tag in args:
        if not tag:
            continue
        parents[tag] += 1
        if parents[tag] == len(args):
            return tag
    return lowest_common_ancestor(parents, *[tag.parent if tag else None for tag in args])

因为亚瑟的回答在某些情况下是不正确的。我修改了亚瑟的答案,并给出了我的答案。我已经用两个节点作为输入测试了LCA的代码

import collections
def lowest_common_ancestor(parents=None, *args):
    if parents is None:
        parents = collections.defaultdict(int)
    for tag in args:
        parents[tag] += 1
        if parents[tag] == NUM_OF_NODES:
            return tag
    next_arg_list = [tag.parent for tag in args if tag.parent is not None]

    return lowest_common_ancestor(parents, *next_arg_list)
调用函数,如下所示:

list_of_tag = [tag_a, tag_b]
NUM_OF_NODES = len(list_of_tag)
lca = lowest_common_ancestor(None, *list_of_tag)
print(lca)

不完全是。我希望它能够为不同数量的链接工作,而不仅仅是两个,但我可以自己编辑。谢谢。正如@Arthur所指出的,只有当两个节点在同一深度时,该算法才有效。似乎该算法不适用于线性树的情况,a--b--c--d--e--f--g,LCA(b,g)应该是b,但该算法将返回a。谢谢!你完全正确。我已经更正了代码以正确处理这些案例。我不认为代码是目前的样子,或者张一鸣的回答是针对张一鸣的评论。当我们执行
*[tag.parent if tag else None for tag in args]
时会出现问题,因为我们已经将树中的每个标记上移了一级。我采用了一种受约阿希姆·伊萨克森启发的方法。