如果包含在一组字符串中,则使用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提供的工具,你需要它。我的答案更像是算法不?哈哈,莎露朵!这听起来像是一个你可能会感兴趣的故事。