2011-01-26 31 views
16
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 

Utilicé el código anterior, pero el resultado obtenido es 0.0. ¿Cómo puedo obtener una respuesta válida?¿Cómo usar SequenceMatcher para encontrar la similitud entre dos cadenas?

+0

https://docs.python.org/3/library/difflib.html#sequencematcher-objects –

Respuesta

27

Olvidó el primer parámetro para 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

+0

Hey respuesta agradable, ¿hay alguna manera de conseguir el número de coincidencias? – Mohsin

+0

get_matching_blocks() –

+0

ya obtuve todas las cadenas, pero no encuentra todas las cadenas comunes, incluso si tiene autojunk configurado como falso – Mohsin

13

A partir de los documentos:

La clase SequenceMatcher tiene este constructor:

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

El problema en su código es que al hacerlo

seq=difflib.SequenceMatcher(a,b) 

está de paso a por la relación calidad isjunkb y por la relación calidad a, dejando el valor por defecto para ''b. Esto da como resultado una proporción de 0.0.

Una forma de superar esto (ya mencionado por Lennart) es pasar explícitamente None como primer parámetro adicional para que todos los argumentos de la palabra clave tengan asignados los valores correctos.

Sin embargo, acabo de encontrar, y quería mencionar otra solución, que no toca el argumento isjunk pero utiliza el método set_seqs() para especificar las diferentes secuencias.

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