比较两个字符串并返回一个最相似的字符串

时间:2011-12-15 11:14:38

标签: python comparison

我必须编写一个函数,它接受一个字符串作为参数,并将该字符串与另外两个字符串进行比较,并返回最相似的字符串和差异数。

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

我试过了:

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))

其中:

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

所以我得到一个例如[1,0,0,0]如果word1 =“NUMB”和word2 =“LUMB”的列表

2 个答案:

答案 0 :(得分:10)

看起来Shawn Chin提供了最佳解决方案,但是如果您无法使用非内置模块,difflib的{​​{3}}可能会有所帮助:

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

可以使用get_close_matchesget_opcodes方法并使用其返回值来获取差异数。

答案 1 :(得分:6)

使用pylevenshtein计算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)

或者,作为一个功能:

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。如果您想避免其他依赖关系,您可以始终实现自己的函数来计算距离。例如,wikibooks中提出了几个版本,每个版本都有各自的优点和缺点。

但是,如果要考虑性能,请考虑坚持使用自定义构建的模块。除了pylevenshtein之外,还有python-levenshteinnltk.metrics.distance(如果您恰好已使用NLTK)。