我正在尝试使用第一个,第二个和最后一个名称来匹配名称,无论是否使用所有这些名称都是正确的顺序。到目前为止,我已经有了这个代码并且它有点工作,但我认为这不是正确的方法。你知道另一种方法吗?
数据集中的名称如下所示:
name = 'DAVID SCOTT MUSTAIN'
如果我搜索'DAVID'
,'MUSTAIN SCOTT'
,'SCOTT DAVID'
等,我想要的是匹配该名称。
到目前为止,我得到的功能如下:
def search_name(somename):
for full_name in some_dataset:
if set(somename.upper().split()).issubset(full_name.split()):
print('match:', full_name)
如果我输入'DAV'
或'SCOT'
之类的内容,则无法匹配任何内容。即使名字不完整,我该如何进行比赛呢?如果我分手了
将这些名称分成单个字母,它将使用这些字母匹配每个名称而不检查字母的顺序。
答案 0 :(得分:2)
您可以使用any
检查somename
中的任何名称是full_name
def search_name(somename):
for full_name in some_dataset:
if any(n.upper() in fn for n in somename.split() for fn in full_name.split()):
print('match:', full_name)
以下是使用sum
和字典来选择匹配最多的名称的示例:
def search_name(somename):
matches = {}
for full_name in some_dataset:
matches[full_name] = sum(1 for n in somename.split() for fn in full_name.split() if n.upper() in fn)
best_matches = [k for k,v in matches.items() if v == max(matches.values()) if v != 0]
for match in best_matches:
print('match:', match)
我确定有更好的方法可以写这个功能,但我的睡眠非常困难。
至于你的第二个问题,也许你可以打印/返回best_matches
列表中的所有项目?
答案 1 :(得分:1)
我做了一个使用更多语句的小功能
def search_name(name, toSearch, num = 2):
found = []
for word in name.split():
search = word[:num]
for letter in word[num:]:
search += letter
isThere = [data for data in toSearch.split() if data in search]
if isThere:
found += isThere
break
return len(toSearch.split()) == len(found)
name = 'DAVID SCOTT MUSTAIN'
if search_name(name,'TA'):
print(name)
else:
print('Nothing')
你想要这个吗?
答案 2 :(得分:0)
我可以使用
if full_name in somename and not set(full_name.split()) - set(someone.split())
查看它是否是一个子字符串,并且它不包含额外的短名称。