如果包含在一组字符串中,则使用Pythonic方法匹配字符串
我试图通过使用第一个、第二个和最后一个名字来匹配名字,顺序是否正确,是否全部使用。到目前为止,我已经有了这段代码,它可以正常工作,但我认为这不是正确的方法。你知道另一种方法吗 数据集中的名称如下所示:如果包含在一组字符串中,则使用Pythonic方法匹配字符串,python,string,Python,String,我试图通过使用第一个、第二个和最后一个名字来匹配名字,顺序是否正确,是否全部使用。到目前为止,我已经有了这段代码,它可以正常工作,但我认为这不是正确的方法。你知道另一种方法吗 数据集中的名称如下所示: name = 'DAVID SCOTT MUSTAIN' def search_name(somename): for full_name in some_dataset: if set(somename.upper().split()).issubset(full
name = 'DAVID SCOTT MUSTAIN'
def search_name(somename):
for full_name in some_dataset:
if set(somename.upper().split()).issubset(full_name.split()):
print('match:', full_name)
如果我搜索'DAVID'
,'MUSTAIN SCOTT'
,'SCOTT DAVID'
,等等,我想要的是匹配这个名字。。
到目前为止,我得到的函数如下所示:
name = 'DAVID SCOTT MUSTAIN'
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'
的内容,这将与任何内容都不匹配。即使姓名不完整,我该如何进行匹配?如果我分开
将名称转换为单个字母它会将每个名称与这些字母匹配,而不检查字母的顺序。您可以使用
any
检查somename
中的任何名称是否是全名
中任何名称的子集
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)
我确信有更好的方法来编写此函数,但我的睡眠非常缺乏。至于你的第二个问题,也许你可以打印/返回
最佳匹配列表中的所有项目?我制作了一个使用更多语句的小函数
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')
你想要这个吗?我可以用
if full_name in somename and not set(full_name.split()) - set(someone.split())
查看它是否是一个子字符串,并且不包含额外的短名称。此匹配不完整的名称,但如果我输入“DAVID SCOTT”,它将匹配所有“SCOTT”,即使它们不是“DAVID”,请参见。在这种情况下,请使用sum
函数并打印匹配项最多的名称(如果有的话)。我知道你的意思,但我不确定如何实现它,你能将其添加到答案中吗?(很抱歉,遇到了麻烦),另外,如果有两个姓不同的“DAVID SCOTT”,会发生什么?假设名称没有要存储的索引号,然后进行查找,它们将具有相同的匹配可能性,因此如果我存储最大可能性,它将覆盖最后一个,如果我将可能性存储在集合中,我以后将无法搜索这些名称。感谢您的帮助,我解决了第二个问题,添加了best_matches
如果max
为0,则不匹配任何内容,只需迭代best_matches
并打印它们。是的,这是个好主意,在best_matches
列表中不需要有分数为0的项目。我批准了你的编辑。我测试了一个无序的字符串来搜索,它工作了,你能更好地解释我这个问题吗,也许是代码?我遇到了它不会与每个组合匹配,我假设它是数字
参数,如果我尝试匹配'TA'
,它与名称不匹配。编辑:我删除了我的上一条评论,因为这不是我的意思,我把单词弄乱了。我编辑了答案,更改了搜索匹配项的行,测试了代码。现在可以了,谢谢!。我给了你一个向上投票的机会来发送你的答案,因为它很有用并且解决了问题,但是我接受了t.m的答案,因为我觉得它更优雅,更可读。没问题,t.m的答案更像Python,因为它使用Python提供的工具,你需要它。我的答案更像是算法不?哈哈,莎露朵!这听起来像是一个你可能会感兴趣的故事。