挣扎着如何用一种Python的方式来做这件事。我有一个我们可以叫名字的列表
[('Jimmy', 'Smith'), ('James', 'Wilson'), ('Hugh' "Laurie')]
然后我有两个变量
First_name = 'Jimm' Last_name = 'Smitn'
我想遍历list的list,名字和姓氏的list,以模糊匹配这些值,并返回与指定的First_name和Last_name最接近的list
kd3sttzy1#
可以通过difflib.SequenceMatcher()返回的最佳匹配比率 (使用max()) 实现模糊匹配。要实现这个,我们应该传递lambda作为key参数,它将返回匹配比率。在我的例子中,我会使用SequenceMatcher.ratio(),但如果性能很重要,你也应该尝试使用SequenceMatcher.quick_ratio()和SequenceMatcher.real_quick_ratio()。
difflib.SequenceMatcher()
max()
lambda
key
SequenceMatcher.ratio()
SequenceMatcher.quick_ratio()
SequenceMatcher.real_quick_ratio()
from difflib import SequenceMatcher lst = [('Jimmy', 'Smith'), ('James', 'Wilson'), ('Hugh', 'Laurie')] first_name = 'Jimm' last_name = 'Smitn' matcher = SequenceMatcher(a=first_name + ' ' + last_name) match_first_name, match_last_name = max(lst, key=lambda x: matcher.set_seq2(' '.join(x)) or matcher.ratio()) print(first_name, last_name, '-', match_first_name, match_last_name)
nx7onnlm2#
另一种可能的途径是使用集合交集。
names = [('Jimmy', 'Smith'), ('James', 'Wilson'), ('Hugh', 'Laurie')] first_name = "Jimm" last_name = "Smitn" setf = set(first_name) # {'m', 'i', 'J'} setl = set(last_name) # {'t', 'n', 'm', 'i', 'S'} ranked = [(len(setf & set(f)) + len(setl & set(l)), f, l) for f, l in names] # [(7, 'Jimmy', 'Smith'), (4, 'James', 'Wilson'), (1, 'Hugh', 'Laurie')] best_match = max(ranked, key=lambda x: x[0])[1:] # ('Jimmy', 'Smith')
2条答案
按热度按时间kd3sttzy1#
可以通过
difflib.SequenceMatcher()
返回的最佳匹配比率 (使用max()
) 实现模糊匹配。要实现这个,我们应该传递
lambda
作为key
参数,它将返回匹配比率。在我的例子中,我会使用SequenceMatcher.ratio()
,但如果性能很重要,你也应该尝试使用SequenceMatcher.quick_ratio()
和SequenceMatcher.real_quick_ratio()
。nx7onnlm2#
另一种可能的途径是使用集合交集。