列表理解与if和break

时间:2018-02-01 22:17:37

标签: python python-3.x list-comprehension

是否可以通过列表理解来完成这个技巧:

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

匹配的2次结果

当我在此example中使用方法时,我遇到了错误'list' object is not an iterator

2 个答案:

答案 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的其余部分。