python difflib未计算最小差异

python difflib未计算最小差异,python,algorithm,difflib,Python,Algorithm,Difflib,我正在使用python的difflib来匹配非字符串序列 我注意到,有时difflib返回的结果并不代表所提供序列中的最小差异 在我的应用程序中,我需要匹配相对较短的序列(长度小于100个元素的序列),因此算法的效率不是问题,但获得最佳(最大匹配长度)结果非常重要 我想我做错了什么,但我不知道是什么 下面是一个可以正常工作的示例: 导入difflib s1=[1,10,2,3,5,6,4] s2=[2,12,3,5,4,6,1] def打印匹配块(s1、s2): matcher=difflib.

我正在使用python的difflib来匹配非字符串序列

我注意到,有时difflib返回的结果并不代表所提供序列中的最小差异

在我的应用程序中,我需要匹配相对较短的序列(长度小于100个元素的序列),因此算法的效率不是问题,但获得最佳(最大匹配长度)结果非常重要

我想我做错了什么,但我不知道是什么

下面是一个可以正常工作的示例:

导入difflib s1=[1,10,2,3,5,6,4] s2=[2,12,3,5,4,6,1] def打印匹配块(s1、s2): matcher=difflib.SequenceMatcher(无、s1、s2、自动垃圾=False) 对于匹配器中的elm。获取匹配块() 印刷品(榆树) 打印匹配块(s1、s2) 运行此操作将返回正确答案:

Match(a=2, b=0, size=1)
Match(a=3, b=2, size=2)
Match(a=5, b=5, size=1)
Match(a=7, b=7, size=0)
以下哪项匹配:

1 <--> _
10 <--> _
2 <--> 2
_ <--> 12
3 <--> 3
5 <--> 5
_ <--> 4
6 <--> 6
4 <--> _
_ <--> 1
整个匹配算法似乎崩溃了

返回的匹配项为:

Match(a=0, b=7, size=1)
Match(a=8, b=8, size=0)
结果仅将s1[0]与s2[7]匹配,即s1的第一个元素与s2的最后一个元素匹配。这显然不是最佳匹配,因为上一个匹配(长度为4)仍然有效,并且比返回的匹配长

我曾尝试关闭自动垃圾检测(如代码示例中所示),但似乎没有任何区别


对于可能导致观察到的行为或如何获得最长匹配的任何建议,我们将不胜感激。

您的预期输出是什么?是否需要找到所有匹配的块?或者你只需要一个相似性度量?交换
s1
s2
是否可以解决您的问题?我需要找到最长的匹配子序列(不仅仅是距离)。交换s1和s2是可以接受的。尝试一下你的建议,我发现用s1替换s2似乎会返回最长的子序列。知道为什么吗?或者,我如何确定调用给定两个序列的“正确”方式(除了双向调用和查看哪个结果更好之外)。我不认为difflib库的内部工作在任何地方都被指定或记录。do说“三元组在i和j中单调增加”,但是,基本上,
get_matching_blocks
函数做的事情与您想要的不同-它不搜索最长的相等序列。您可能需要编写自己的代码才能做到这一点。谢谢您的回答,我理解您的意思。我希望diff算法能够提供最佳解决方案(将s1转换为s2的最小编辑操作)。我知道这对于长序列来说是非常昂贵的,difflib可能正在使用启发式在“合理”的时间内返回“足够好的解决方案”。您的预期输出是什么?是否需要找到所有匹配的块?或者你只需要一个相似性度量?交换
s1
s2
是否可以解决您的问题?我需要找到最长的匹配子序列(不仅仅是距离)。交换s1和s2是可以接受的。尝试一下你的建议,我发现用s1替换s2似乎会返回最长的子序列。知道为什么吗?或者,我如何确定调用给定两个序列的“正确”方式(除了双向调用和查看哪个结果更好之外)。我不认为difflib库的内部工作在任何地方都被指定或记录。do说“三元组在i和j中单调增加”,但是,基本上,
get_matching_blocks
函数做的事情与您想要的不同-它不搜索最长的相等序列。您可能需要编写自己的代码才能做到这一点。谢谢您的回答,我理解您的意思。我希望diff算法能够提供最佳解决方案(将s1转换为s2的最小编辑操作)。我知道这对于长序列来说是非常昂贵的,difflib可能正在使用启发式方法在“合理”的时间内返回“足够好的解决方案”。
Match(a=0, b=7, size=1)
Match(a=8, b=8, size=0)