比较两个类似于startswith的列表

时间:2018-01-15 09:37:32

标签: python string python-2.7 list startswith

我正在尝试编写一个简单的逻辑,它将在一个列表中查找以其他列表中的单词开头的单词。例如:

a = ["let","test","g"]
b = ["letter", "testing","good","egg","protest"]

应该返回:letter, testing, good

我已经涉足.startswith(),但似乎无法使用整个列表进行搜索。还试过:

if any(i in a for i in b):

但是我无法得到任何结果。

4 个答案:

答案 0 :(得分:9)

str.startswith()接受元组:

>>> a = ["let","test","g"]
>>> b = ["letter", "testing","good","egg","protest"]
>>> a = tuple(a)
>>> [item for item in b if item.startswith(a)]
['letter', 'testing', 'good']

答案 1 :(得分:4)

你可以用列表理解来做到这一点:

>>> [y for x in a for y in b if y.startswith(x)]
['letter', 'testing', 'good']

您需要迭代这两个列表,然后检查列表a中的元素是否是列表b中对象的开头。

如果您只是需要进行条件测试,最好使用发电机。这将在列表中的第一场比赛中停止:

>>> gen_exp = (y for x in a for y in b if y.startswith(x))
>>> if any(gen_exp):
        __ your logic here __

答案 2 :(得分:1)

如果您想在b中找到以某个字符串开头的第一个元素,可以使用next

word = next(bword for bword in b if bword.startswith(aword))

如果b中没有此类字词,您可以提供默认值

word = next((bword for bword in b if bword.startswith(aword)), None)

要将其应用于a的每个元素,您可以使用列表推导。

words = [next((bword for bword in b if bword.startswith(aword)), None) for aword in a]

这会产生:

['letter', 'testing', 'good']

答案 3 :(得分:0)

我更喜欢在这种情况下使用itertools模块:

>>> [value for (start, value) in itertools.product(a,b) if value.startswith(start)]
['letter', 'testing', 'good']