如何使用SequenceMatcher对比两个字符串的相似性?

36 投票
2 回答
70150 浏览
提问于 2025-04-16 10:38
import difflib

a='abcd'
b='ab123'
seq=difflib.SequenceMatcher(a=a.lower(),b=b.lower())
seq=difflib.SequenceMatcher(a,b)
d=seq.ratio()*100
print d

我用了上面的代码,但得到的结果是0.0。我该怎么才能得到一个有效的答案呢?

2 个回答

22

根据文档:

SequenceMatcher 类的构造函数是这样的:

class difflib.SequenceMatcher(isjunk=None, a='', b='', autojunk=True)

你代码中的问题是,执行了

seq=difflib.SequenceMatcher(a,b)

这段代码后,你把 a 当成了 isjunk 的值,把 b 当成了 a 的值,而 b 则保留了默认的空字符串 ''。这样就导致了比率为 0.0

解决这个问题的一种方法(Lennart 已经提到过)是明确地将 None 作为第一个参数传入,这样所有的关键字参数就能被正确赋值。

不过我刚发现了另一种解决方案,它不涉及 isjunk 参数,而是使用 set_seqs() 方法来指定不同的序列。

>>> import difflib
>>> a = 'abcd'
>>> b = 'ab123'
>>> seq = difflib.SequenceMatcher()
>>> seq.set_seqs(a.lower(), b.lower())
>>> d = seq.ratio()*100
>>> print d
44.44444444444444
58

你忘记给SequenceMatcher传第一个参数了。

>>> import difflib
>>> 
>>> a='abcd'
>>> b='ab123'
>>> seq=difflib.SequenceMatcher(None, a,b)
>>> d=seq.ratio()*100
>>> print d
44.4444444444

http://docs.python.org/library/difflib.html

撰写回答