Python、嵌套循环、匹配和performan

2024-10-02 08:27:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用Python2.7和Levenshtein函数将姓氏列表与全名列表相匹配。为了减少工作量,我只在第一个字母相同的情况下匹配(尽管这在性能方面似乎没有多大区别)。如果找到匹配项,则从全名中删除匹配词(以使后续的名字匹配更容易)。 这两个列表都包含数万个条目,因此我的解决方案相当缓慢。在不解析全名的情况下,我怎么能加快速度呢? 以下是我到目前为止的情况(对于姓氏由几个词组成的情况,我省略了一些if条件):

import Levenshtein

listoflastnames=(['Jones', 'Sallah'])
listoffullnames=(['Henry', 'Jones', 'Junior'],['Indiana', 'Jones'])


def match_strings(lastname, listofnames):
    match=0
    matchedidx=[]
        for index, nameelement in enumerate(listofnames):        
            if lastname[0]==nameelement [0]:
                if Levenshtein.distance(nameelement, lastname)<2:
                    matchedidx.append(index)
                    match=match+1
    if match==1:
        newnamelist = [i for j, i in enumerate(listofnames) if j not in matchedidx]
    return 1, newnamelist 
return 0, listofnames



for x in listoflastnames:
    for y in listoffullnames:
        match, newlistofnames=match_strings(x,y)
        if match==1:
            #go to first name match...

任何帮助都将不胜感激!在

更新:在此期间,我使用了多处理模块,让我的4个内核都能处理这个问题,而不仅仅是一个,但是匹配仍然需要很多时间。在


Tags: in列表forifmatch情况levenshteinjones
1条回答
网友
1楼 · 发布于 2024-10-02 08:27:25

这简化了match_string函数中的for循环,但在我的测试中并没有显著提高速度。最大的损失是在具有姓氏和全名的两个for循环中。在

def match_strings(lastname, listofnames):
    firstCaseMatched = [name for name in listofnames if lastname[0] == name[0]]
    if len(firstCaseMatched):
        matchedidx = [index for index, ame in enumerate(firstCaseMatched) if Levenshtein.distance(lastname, name) < 2]
        match = len(matchedidx)
    else:
        match = 0
    if match == 1:
        newnamelist = [i for j, i in enumerate(listofnames) if j not in matchedidx]
        return 1, newnamelist
    return 0, listofnames

您可能需要对已知姓氏的列表进行排序,将它们拆分为每个起始字符的dict。然后将名单中的每个名字与之对应。在

假定第一个元素的全名始终为第一个元素。您可以将比较限制为仅对其他元素进行比较。在

相关问题 更多 >

    热门问题