【问题标题】:list comprehension with if and break用 if 和 break 列出理解
【发布时间】:2018-07-12 08:44:05
【问题描述】:

是否有可能用列表理解来做这个技巧:

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]

我有两个匹配两个关键字watch movie about training course 的 2 次结果

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

【问题讨论】:

  • 不要在这里使用列表推导。列表推导式用于创建列表而不是用于打印
  • print(x) 很简单,我可以在这个结构中使用[lst.append(x)]。然后我可以使用 set(lst) 来做不同的值。也许存在一种单行构造的方法?
  • 没有。 不要在列表解析中使用lst.append,列表解析用于创建列表而不是用于副作用。
  • 你可以做类似matches = [x for x in queries.split(',') if any(y in x for y in keywords)] 然后for match in matches: print(match)
  • 一般来说,不要将列表理解视为“单行 for 循环”。那不是它的目的。它是一种用于创建列表的功能构造,以一种美观、易读的格式组合映射/过滤行为。不要在列表推导中使用副作用,如果最后不需要列表,请不要使用列表推导。

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


【解决方案1】:

您可以使用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) 去除元素上的空间。)

【讨论】:

  • @AGNGazer 此代码不会继续通过 keywords .. any 短路
  • 不是反对票,而是您在 '\n'.join(..) 中创建了一个不必要的列表,您可以在其中使用生成器(尽管这可能符合问题的精神)
【解决方案2】:

使用itertools:

import itertools
[x for x in queries.split(',')
 if len(list(itertools.takewhile(lambda i: i not in x, keywords)))
    != len(keywords)]

抱歉缩进很丑。

一旦检测到一个匹配项,上面的代码就会停止检查keywords 的其余部分。

【讨论】:

    猜你喜欢
    • 2019-05-27
    • 2013-03-06
    • 2022-05-21
    • 1970-01-01
    • 2012-02-19
    • 2014-08-27
    相关资源
    最近更新 更多