Python – diferencia entre dos cuerdas

Me gustaría almacenar muchas palabras en una lista. Muchas de estas palabras son muy similares. Por ejemplo, tengo la palabra afrykanerskojęzyczny y muchas palabras como afrykanerskojęzycznym , afrykanerskojęzyczni , nieafrykanerskojęzyczni . ¿Cuál es la solución efectiva (rápida y de tamaño pequeño) para encontrar la diferencia entre dos cadenas y restaurar la segunda cadena desde la primera y la diferencia?

Puede usar ndiff en el módulo difflib para hacer esto. Tiene toda la información necesaria para convertir una cadena en otra cadena.

Un ejemplo simple:

 import difflib cases=[('afrykanerskojęzyczny', 'afrykanerskojęzycznym'), ('afrykanerskojęzyczni', 'nieafrykanerskojęzyczni'), ('afrykanerskojęzycznym', 'afrykanerskojęzyczny'), ('nieafrykanerskojęzyczni', 'afrykanerskojęzyczni'), ('nieafrynerskojęzyczni', 'afrykanerskojzyczni'), ('abcdefg','xac')] for a,b in cases: print('{} => {}'.format(a,b)) for i,s in enumerate(difflib.ndiff(a, b)): if s[0]==' ': continue elif s[0]=='-': print(u'Delete "{}" from position {}'.format(s[-1],i)) elif s[0]=='+': print(u'Add "{}" to position {}'.format(s[-1],i)) print() 

huellas dactilares:

 afrykanerskojęzyczny => afrykanerskojęzycznym Add "m" to position 20 afrykanerskojęzyczni => nieafrykanerskojęzyczni Add "n" to position 0 Add "i" to position 1 Add "e" to position 2 afrykanerskojęzycznym => afrykanerskojęzyczny Delete "m" from position 20 nieafrykanerskojęzyczni => afrykanerskojęzyczni Delete "n" from position 0 Delete "i" from position 1 Delete "e" from position 2 nieafrynerskojęzyczni => afrykanerskojzyczni Delete "n" from position 0 Delete "i" from position 1 Delete "e" from position 2 Add "k" to position 7 Add "a" to position 8 Delete "ę" from position 16 abcdefg => xac Add "x" to position 0 Delete "b" from position 2 Delete "d" from position 4 Delete "e" from position 5 Delete "f" from position 6 Delete "g" from position 7 

Me gusta la respuesta de ndiff, pero si quiere escupir todo en una lista de solo los cambios, podría hacer algo como:

 import difflib case_a = 'afrykbnerskojęzyczny' case_b = 'afrykanerskojęzycznym' output_list = [li for li in difflib.ndiff(case_a, case_b) if li[0] != ' '] 

Puede mirar en el módulo de expresiones regulares (la sección borrosa). No sé si puede obtener las diferencias reales, pero al menos puede especificar el número permitido de diferentes tipos de cambios como insertar, eliminar y sustituciones:

 import regex sequence = 'afrykanerskojezyczny' queries = [ 'afrykanerskojezycznym', 'afrykanerskojezyczni', 'nieafrykanerskojezyczni' ] for q in queries: m = regex.search(r'(%s){e<=2}'%q, sequence) print 'match' if m else 'nomatch' 

Lo que estás pidiendo es una forma especializada de compresión. xdelta3 fue diseñado para este tipo de compresión en particular, y hay un enlace de python para él, pero probablemente podría salirse con la utilización de zlib directamente. zlib.compressobj usar zlib.compressobj y zlib.decompressobj con el parámetro zdict configurado en su “palabra base”, por ejemplo, afrykanerskojęzyczny .

Las advertencias de zdict solo se admiten en Python 3.3 y superior, y es más fácil de codificar si tiene la misma “palabra base” para todas sus diferencias, que puede o no ser lo que desea.

La respuesta a mi comentario anterior sobre la pregunta original me hace pensar que esto es todo lo que quiere:

 loopnum = 0 word = 'afrykanerskojęzyczny' wordlist = ['afrykanerskojęzycznym','afrykanerskojęzyczni','nieafrykanerskojęzyczni'] for i in wordlist: wordlist[loopnum] = word loopnum += 1 

Esto hará lo siguiente:

Para cada valor en la lista de palabras, establezca ese valor de la lista de palabras en el código original.

Todo lo que tiene que hacer es poner esta pieza de código donde necesita cambiar la lista de palabras, asegurándose de almacenar las palabras que necesita cambiar en la lista de palabras y que la palabra original sea correcta.

¡Espero que esto ayude!