如何按字符匹配Python元素

2024-10-03 09:12:25 发布

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

我有两张单子

List1 = ['hello','welcome','india','nation']
List2 = ['ind', 'nat','hellooo','welcomeeee']

我想比较元素并打印如下-

输出:

^{pr2}$

请提出一些优化的方法。在

我有一个未指定大小的列表,但它有一个列表元素与另一个列表元素匹配,因为随机,我不知道任何列表中最大/最长匹配的大小。在


Tags: 方法元素hello列表nat单子welcomeind
3条回答

您可以使用Levenshtein distance来确定最接近的匹配,因此以下是Levenshtein的一个实现:

def levenshteinDistance(s1, s2):
    if len(s1) > len(s2):
        s1, s2 = s2, s1

    distances = range(len(s1) + 1)
    for i2, c2 in enumerate(s2):
        distances_ = [i2+1]
        for i1, c1 in enumerate(s1):
            if c1 == c2:
                distances_.append(distances[i1])
            else:
                distances_.append(1 + min((distances[i1], distances[i1 + 1], distances_[-1])))
        distances = distances_
    return distances[-1]


List1 = ['hello', 'welcome', 'india', 'nation']
List2 = ['ind', 'nat', 'helloooo', 'welcomeeeeee']

[min(zip(List1, [levenshteinDistance(j, i) for j in List1]), key=lambda x: x[1])[0] for i in List2]
#['india', 'nation', 'hello', 'welcome']

列表理解

In [14]: [j for i in List2 for j in List1 if i in j or j in i]
Out[14]: ['india', 'nation', 'hello', 'welcome']

@AndreiDurnea's solution类似,还可以使用生成器:

def comparer(L1, L2):
    for i in L2:
        for j in L1:
            if (i in j) or (j in i):
                yield j

List1 = ['hello','welcome','india','nation']
List2 = ['ind', 'nat','helloooo','welcomeeeeee']

res = list(comparer(List1, List2))

['india', 'nation', 'hello', 'welcome']

根据@pault的评论,^{}使用列表理解可能比生成器更有效:

^{pr2}$

相关问题 更多 >