查找 python 列表/numpy 数组之间的最长重叠(非交集)

Find longest overlap between python lists / numpy arrays (not intersection)

提问人:HTF-struggle 提问时间:10/27/2023 最后编辑:Marco BonelliHTF-struggle 更新时间:10/27/2023 访问量:42

问:

我想知道是否有一种有效的方法来找到列表或 numpy 数组(内置函数、列表推导或其他简短方法)之间的最长(或任何/每个)重叠。我已经读过关于使用集合来查找列表/数组的交集(出现在两者中的元素),但我需要找到出现在两者中的(最长/所有)公共序列(子列表/数组)。转向其他数据类型以帮助实现这一点是一种选择。

例:

list1 = [1,2,3,5,4,6,9,8]
list2 = [3,8,2,3,5,4,1,2]

overlap = find_overlap(list1,list2) # function find_overlap TBD
# overlap == [2,3,5,4]

示例中两个列表的交集将返回 [1,2,3,4,5,8]。但是,这返回了所有公共元素,而不是我需要的公共序列。

我试图找到内置函数,但没有成功。我也没有发现这里有人提出类似的问题。我可以编写一个迭代或递归函数来尝试实现这一点,但我担心遇到大型(>100.000 个项目)大小列表/数组的爆炸性计算时间。

Python 数组 列表 重叠

评论

1赞 Marco Bonelli 10/27/2023
这是一个非常众所周知的问题,具有众所周知的解决方案:请参阅 en.wikipedia.org/wiki/Longest_common_subsequenceen.wikipedia.org/wiki/Longest_common_substring

答:

0赞 blhsing 10/27/2023 #1

您可以使用 difflib。SequenceMatcher.find_longest_match

from difflib import SequenceMatcher

list1 = [1,2,3,5,4,6,9,8]
list2 = [3,8,2,3,5,4,1,2]
match = SequenceMatcher(None, list1, list2).find_longest_match()
print(list1[match.a: match.a + match.size])

这将输出:

[2, 3, 5, 4]