将值模糊匹配到列表python的列表

u59ebvdq  于 2022-12-25  发布在  Python
关注(0)|答案(2)|浏览(217)

挣扎着如何用一种Python的方式来做这件事。我有一个我们可以叫名字的列表

[('Jimmy', 'Smith'), ('James', 'Wilson'), ('Hugh' "Laurie')]

然后我有两个变量

First_name = 'Jimm'

Last_name = 'Smitn'

我想遍历list的list,名字和姓氏的list,以模糊匹配这些值,并返回与指定的First_name和Last_name最接近的list

kd3sttzy

kd3sttzy1#

可以通过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)
nx7onnlm

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

相关问题