是否可以通过列表理解来完成这个技巧:
queries = """watch movie online, sport news, movie poster, course of events, movie in this summer, python course, serials about sports, watch movie about training course"""
keywords = ['movie','course']
这个方法都很好
for x in queries.split(','):
for y in keywords:
if y in x:
print(x)
break
当我使用这样的列表理解时:
r = [print(x) for x in queries.split(',') for y in keywords if y in x]
我有两次2个关键字watch movie about training course
当我在此example中使用方法时,我遇到了错误'list' object is not an iterator
答案 0 :(得分:2)
您可以使用any
在第二个列表中根据关键字搜索创建过滤后的新列表:
>>> [x for x in queries.split(',') if any(kw in x for kw in keywords)]
['watch movie online', ' movie poster', ' course of events', ' movie in this summer', ' python course', ' watch movie about training course']
break
自然位于any
,因为它会在第一个True上发生短路并在keywords
上突破循环。
然后使用'\n'.join(iterable)
打印新列表或序列,以获得在循环中打印每个元素的效果。
>>> print ('\n'.join(x for x in queries.split(',') if any(kw in x for kw in keywords)))
watch movie online
movie poster
course of events
movie in this summer
python course
watch movie about training course
在这种情况下,您可以使用生成器与列表理解。
但是,不要害怕在Python中使用循环;它们很容易理解并且意图明显。
(如果需要,您可以使用.lstrip(x)
剥离元素上的空格。)
答案 1 :(得分:-1)
使用itertools
:
import itertools
[x for x in queries.split(',')
if len(list(itertools.takewhile(lambda i: i not in x, keywords)))
!= len(keywords)]
抱歉丑陋的缩进。
一旦检测到一个匹配,上面的代码就会停止检查keywords
的其余部分。