我必须编写一个函数,它接受一个字符串作为参数,并将该字符串与另外两个字符串进行比较,并返回最相似的字符串和差异数。
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”的列表
答案 0 :(得分:10)
看起来Shawn Chin提供了最佳解决方案,但是如果您无法使用非内置模块,difflib
的{{3}}可能会有所帮助:
import difflib
difflib.get_close_matches("LUMB", ["JIBM", "NUNE", "NUMB"], 1)
可以使用get_close_matches
的get_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-levenshtein和nltk.metrics.distance
(如果您恰好已使用NLTK)。