我正在使用python的difflib来匹配非字符串序列。
我注意到有时difflib返回的结果并不代表所提供序列的最小差异。
在我的应用程序中,我需要匹配相对较短的序列(长度低于100个元素的序列),因此算法的效率不是问题,但获得最佳(最大匹配长度)结果非常重要。 / p>
我认为我做错了什么,但我无法弄清楚是什么。
这是一个可行的例子:
import difflib
s1 = [1,10, 2, 3, 5, 6, 4]
s2 = [2,12, 3, 5, 4, 6, 1]
def printMatchingBlocks(s1,s2):
matcher = difflib.SequenceMatcher(None, s1, s2,autojunk=False)
for elm in matcher.get_matching_blocks():
print( elm)
printMatchingBlocks(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
但是,如果我在测试序列中添加两个不同的数字,位置4(示例中为13和14):
s1 = [1,10, 2, 3, 13, 5, 6, 4]
s2 = [2,12, 3, 5, 14, 4, 6, 1]
整个匹配算法似乎崩溃了。
返回的比赛是:
Match(a=0, b=7, size=1)
Match(a=8, b=8, size=0)
结果简单地将s1 [0]与s2 [7]匹配,即s1的第一个元素与s2的最后一个元素匹配。这显然不是最佳匹配,因为上一场比赛(长度为4)仍然有效并且长于返回的比赛。
我尝试关闭自动侦测功能(如代码示例所示),但它似乎没有任何区别。
任何关于可能导致观察到的行为或我如何获得最长匹配的建议都将受到高度赞赏。