列表理解等效而不产生一次性列表

时间:2012-01-02 07:08:21

标签: python syntax list-comprehension

  

可能重复:
  Is it Pythonic to use list comprehensions for just side effects?
  proper use of list comprehensions - python

Python具有有用且优雅的list comprehension语法。但是AFAIK总是产生一个列表。有时我觉得使用列表理解的冲动只是因为它的紧凑性和优雅而不需要结果列表:

[some_func(x) for x in some_list if x>5]

some_func()可能会返回我不需要的东西,它可能根本不会返回任何内容。我尝试了生成器语法:

(some_func(x) for x in some_list if x>5)

但正如您可能猜到的那样,它不会迭代some_list。它只在某些情况下这样做:

other_func(some_func(x) for x in some_list if x>5)

所以...是否有一种语法让我无法使用它,或者我应该总是回到3行?

for x in some_list:
    if x>5:
        some_func(x)

4 个答案:

答案 0 :(得分:10)

我现在不会发现它很优雅,但是有一个非常快的consume recipe in the itertools docs并且会运行一个迭代器来完成而不会建立一个列表:

>>> consume(some_func(x) for x in some_list if x>5)

答案 1 :(得分:3)

使用genex获取适当的值以进行迭代。

for i in (x for x in some_list if x > 5):
    some_func(i)

答案 2 :(得分:2)

如果some_func()没有返回值(即返回None):

any(some_func(x) for x in some_list if x > 5)

是可能的。

否则你可以这样做:

any(some_func(x) and False for x in some_list if x > 5)

或者更可读(假设匹配all的普通英语含义)是:

all(some_func(x) or True for x in some_list if x > 5)

我喜欢Raymond发现的consume配方,因为它不会强迫你让生成器返回一些特定值来保证它完全被消耗,并且启动速度会更快。 / p>

答案 3 :(得分:0)

老实说,在我的代码中,我更喜欢使用三行表达,但我认为你正在寻找的单行可能是这一行:

for x in some_list: func(x) if x>5 else None

注意:我尝试使用pass代替None,但我看起来会更好一些,但会引发SyntaxError例外。