我正在尝试编写一个简单的逻辑,它将在一个列表中查找以其他列表中的单词开头的单词。例如:
a = ["let","test","g"]
b = ["letter", "testing","good","egg","protest"]
应该返回:letter, testing, good
。
我已经涉足.startswith()
,但似乎无法使用整个列表进行搜索。还试过:
if any(i in a for i in b):
但是我无法得到任何结果。
答案 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']