列表匹配条件中元素的Python

列表匹配条件中元素的Python,python,python-3.x,for-loop,Python,Python 3.x,For Loop,我发现自己经常根据某个循环只需要的条件对列表的子集进行迭代,我想知道是否有更有效的方法来编写此循环 以列表为例: foo=[1,2,3,4,5] 如果我想构建一个for循环,循环遍历大于2的每个元素,我通常会这样做: for x in [y for y in foo if y > 2]: # Do something 然而,这似乎是多余的,在我看来不是非常可读。我不认为这是特别低效的,特别是当使用发电机时,正如@iota在下面指出的那样,但是我更希望能够编写如下内容: for x

我发现自己经常根据某个循环只需要的条件对列表的子集进行迭代,我想知道是否有更有效的方法来编写此循环

以列表为例:

foo=[1,2,3,4,5]

如果我想构建一个for循环,循环遍历大于2的每个元素,我通常会这样做:

for x in [y for y in foo if y > 2]:
    # Do something
然而,这似乎是多余的,在我看来不是非常可读。我不认为这是特别低效的,特别是当使用发电机时,正如@iota在下面指出的那样,但是我更希望能够编写如下内容:

for x in foo if x > 2:
    # Do something
理想情况下,不需要第二个for和整个其他临时变量。这有语法吗?我使用Python3,但我认为任何这样的语法都可能有Python2变体


注意:这显然是一个非常简单的示例,可以通过范围或排序与切片等方式更好地处理,因此假设foo是任何必须按任意条件过滤的任意列表

不完全是您想要的语法,但也可以使用lambda:

for x in filter(lambda y: y > 2, foo):
    print(x)
或者为了可读性使用函数:

def greaterthantwo(y):
    return y > 2

for x in filter(greaterthantwo, foo):
    print(x)

过滤器还具有创建生成器表达式的优点,因此,如果您提前退出循环,它不会计算所有值,而不是使用新列表,这与您所追求的语法不同,但您也可以使用lambda:

for x in filter(lambda y: y > 2, foo):
    print(x)
或者为了可读性使用函数:

def greaterthantwo(y):
    return y > 2

for x in filter(greaterthantwo, foo):
    print(x)
过滤器还具有创建生成器表达式的优点,因此如果您提前退出循环,它不会计算所有值,而不是使用新列表

高效代码

data = (x for x in foo if x>2)
print(next(data))
获取更可读的代码

[print(x) for x in foo if x>2]
我想要这个

高效代码

data = (x for x in foo if x>2)
print(next(data))
获取更可读的代码

[print(x) for x in foo if x>2]

有@salparadise中讨论的过滤器,但您也可以使用生成器:

def filterbyvalue(seq, value):
   for el in seq:
       if el.attribute==value: 
           yield el
           
for x in filterbyvalue(foo,2):
    #Do something

它可能看起来更大,但当你不得不做一些复杂的事情而不是过滤时,它很有用。它的性能也比首先创建一个列表理解然后在上面循环要好。

有@salparade中讨论的过滤器,但你也可以使用生成器:

def filterbyvalue(seq, value):
   for el in seq:
       if el.attribute==value: 
           yield el
           
for x in filterbyvalue(foo,2):
    #Do something

它可能看起来更大,但当你不得不做一些复杂的事情而不是过滤时,它很有用。它的性能也比首先创建列表理解然后在其上循环要好。

列表理解用于创建列表,而不是迭代列表,因此[y for y in foo if y>2]正是这样做的,创建一个列表。然后作为第二步对其进行迭代。列表理解用于创建列表,而不是迭代列表,因此[y for y in foo如果y>2],则创建一个列表。然后作为第二步对其进行迭代。这是一个强大的选项-可读性已经大大提高,并且能够插入外部函数作为过滤器是一个优势。这是一个强大的选项-可读性已经大大提高,此外,能够插入外部函数作为过滤器也是一个优势。列表理解不应用于产生副作用:列表理解不应用于产生副作用: