如何匹配2个字符串列表?

时间:2019-07-17 08:47:33

标签: python

我想编写Python代码以使用“字母”列表从“单词”中搜索匹配项。 我创建了以下两个列表-单词和字母:

word = ['hello', 'how', 'are', 'you', 'potato']
letter = ['how', 'ell', 'aaa', 'bbb', 'tat', 're']

我想要得到的是以下输出作为列表,以及“单词”和“字母”列表之间的映射结果。 如果匹配了完整的字符串,则结果将返回“ True”。 如果部分字符串匹配,则结果将返回“ True”。 如果字符串的nil部分匹配,则结果将返回“ False”。

word_result = ['True', 'True', 'True', 'False', 'True']

我尝试使用for循环/ if ... else / import re,但无法获得所需的结果。

有人可以帮忙吗?

非常感谢您!

我使用以下代码进行了测试,但无法正常工作

word = ['hello', 'how', 'are', 'you', 'potato']
letters = ['ell', 'how', 'aaa', 'bbb', 'tat', 're']

def check_match():

    for l in letters:
        if l in word:
            print(l)

print(check_match())

预期结果:

word_result = ['True', 'True', 'True', 'False', 'True']

3 个答案:

答案 0 :(得分:4)

any使用列表理解:

word = ['hello', 'how', 'are', 'you', 'potato']
letters = ['ell', 'how', 'aaa', 'bbb', 'tat']

def check_match():
    return [any(x in i for x in letters) for i in word]

print(check_match())

输出:

[True, True, False, False, True]

答案 1 :(得分:0)

我不确定您的预期输出是否正确。 这是应该起作用的代码:

def check_match():
    res = []
    for l in letters:
        for w in word:
            if l in w:
                res.append(True)
                break
        else:
            res.append(False)
    return res

输出:

[True, True, False, False, True]

编辑: 现在我得到了您的问题...首先,向您显示不同的输入:

word = ['hello', 'how', 'are', 'you', 'potato']
letter = ['how', 'ell', 'aaa', 'bbb', 'tat', 're'] 

然后使用了不同的方法:

word = ['hello', 'how', 'are', 'you', 'potato']
letters = ['ell', 'how', 'aaa', 'bbb', 'tat']

第二,您要检查来自word的单词是否具有来自letters的相应字母。您所需要做的就是切换循环:

def check_match():
    res = []
    for w in word:
        for l in letters:
            if l in w:
                res.append(True)
                break
        else:
            res.append(False)
    return res

输出:

[True, True, True, False, True]

答案 2 :(得分:0)

您没有部分匹配的精确定义,这使得难以完全回答您的问题。

但是,我们可以将此(缺失的)智慧范围限制为一个函数:

def partial_match(word, letter):
    ...

其余逻辑可以通过嵌套循环轻松编写:

words = ['hello', 'how', 'are', 'you', 'potato']
letters = ['ell', 'how', 'aaa', 'bbb', 'tat']

results = []
for word in words:
    result = False
    for letter in letters:
        if word == letter or partial_match(word, letter):
            result = True
            break
    results.append(result)

循环的内部是编程中的常见设计模式,Python使用any()原语并将内部循环重写为一种理解方式,为此提供了捷径:

results = []
for word in words:
    result = any(
        word == letter or partial_match(word, letter)
        for letter in letters)
    results.append(result)

或更紧凑,重写两个循环都是一种理解:

results = [
    any(
        word == letter or partial_match(word, letter)
        for letter in letters)
    for word in words]

现在,让我们专注于partial_match(),如果您想要确保letter中包含word,例如:

  • partial_match('how', 'ow') == True
  • partial_match('how', 'ho') == True
  • partial_match('how', 'o') == True
  • partial_match('how', 'oww') == False
  • partial_match('how', 'wow') == False
  • partial_match('how', 'hoe') == False
  • partial_match('how', 'xxx') == False

然后您可以简单地使用:

def partial_match(word, letter):
    return letter in word

,并注意到精确匹配(由word == letter描述)也将满足partial_match(),而您通过省略==内联{{1 }}和几个重命名。

如果您的partial_match()不同,则以上所有内容仍然有效,您只需要优化该功能即可。