web-dev-qa-db-fra.com

Comment utiliser SequenceMatcher pour trouver une similitude entre deux chaînes?

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

J'ai utilisé le code ci-dessus mais la sortie obtenue est de 0,0. Comment puis-je obtenir une réponse valide?

27
joolie

Vous avez oublié le premier paramètre de 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

40
Lennart Regebro

De la documentation:

La classe SequenceMatcher a ce constructeur:

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

Le problème dans votre code est qu'en faisant

seq=difflib.SequenceMatcher(a,b)

vous passez a comme valeur pour isjunk et b comme valeur pour a, en laissant la valeur par défaut '' pour b. Il en résulte un ratio de 0.0.

Une façon de surmonter cela (déjà mentionnée par Lennart) est de passer explicitement None comme premier paramètre supplémentaire afin que tous les arguments de mot-clé reçoivent les valeurs correctes.

Cependant, je viens de trouver, et je voulais mentionner une autre solution, qui ne touche pas à l'argument isjunk mais utilise la méthode set_seqs() pour spécifier les différentes séquences.

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