2011-12-15 12 views
5

Devo scrivere una funzione che accetta una stringa come argomento e riconduce questa stringa a due altre stringhe e restituisce la stringa più simile e il numero di differenze.confronto di due stringhe e restituisce quello più simile

def func("LUMB"): 
    lst=["JIBM", "NUNE", "NUMB"] 
should return: 
("NUMB",1) 

ho provato:

def f(word): 
    lst=["JIBM", "NUNE", "NUMB"] 
    for i in lst: 
     d=k(word, lst) 
     return differences 
     for n in d: 
      print min(sum(n)) 

dove:

def k(word1, word2): 
    L=[] 
    for w in range(len(word1)): 
     if word1[w] != word2[w]: 
      L.append(1) 
     else: 
      L.append(0) 
    return L 

in modo che io ottenere un elenco di esempio, [1,0,0,0] se word1 = "NUMB "e word2 =" LUMB"

+3

Hai visto [Algoritmo di differenza del testo] (http://stackoverflow.com/questions/145607/text-difference-algorithm) e [Good Python modules per il confronto stringa fuzzy] (http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison) – Chris

+0

Un numero di risposte sarebbe disponibile anche su questo link http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy -stringa-confronto –

+0

Sul sito c'è un post simile. Si otterrebbero alcune risposte più preziose qui http://stackoverflow.com/questions/682367/good-python-modules-for-fuzzy-string-comparison –

risposta

10

sembra Shawn Chin ha fornito la soluzione migliore, ma se si sta precluso l'utilizzo di moduli non-built, sembra get_close_matches da difflib potrebbe aiutare:

import difflib 
difflib.get_close_matches("LUMB", ["JIBM", "NUNE", "NUMB"], 1) 

Il numero di differenze può essere ottenuto utilizzando il metodo di get_opcodesSequenceMatcher e lavorare con il suo valore di ritorno.

+0

Mentre questo non restituisce la distanza di modifica, mi piace che usi solo la libreria standard. +1 –

6

Utilizzando pylevenshtein per calcolare Levenshtein distance:

>>> from Levenshtein import distance 
>>> from operator import itemgetter 
>>> lst = ["JIBM", "NUNE", "NUMB"] 
>>> min([(x, distance("LUMB", x)) for x in lst], key=itemgetter(1)) 
('NUMB', 1) 

Oppure, in funzione:

from Levenshtein import distance 
from operator import itemgetter 
def closest(word, lst): 
    return min([(x, distance(word, x)) for x in lst], key=itemgetter(1)) 

print closest("NUMB", ["JIBM", "NUNE", "NUMB"]) 

P.S. Se si desidera evitare dipendenze aggiuntive, è sempre possibile implementare la propria funzione per il calcolo della distanza. Ad esempio, diverse versioni sono proposte in wikibooks ciascuna con i propri pro e contro.

Tuttavia, se le prestazioni sono un problema, considerare di attenersi ai moduli personalizzati. A parte lo pylevenshtein, ci sono anche python-levenshtein e nltk.metrics.distance (se già usi NLTK).