Python中的条件for循环

39

Python 有类似下面这样的东西吗?

for item in items #where item>3:
  #.....

我的意思是同时安装Python 2.7和Python 3.3。

5个回答

70

您可以将循环与生成器表达式结合使用:

for x in (y for y in items if y > 10):
    ....

itertools.ifilter(py2)/ filter(py3)是另一种选择:

items = [1,2,3,4,5,6,7,8]

odd = lambda x: x % 2 > 0

for x in filter(odd, items):
    print(x)

7
这是正确的方法,因为不会产生中间数组。这称为生成器表达式。我认为遗憾的是你不能只写更简短的for x in items if x>10: - Michael Anderson
@MichaelAnderson:是的,那将会很不错。据说Guido已经拒绝了这种语法,但我还没有找到证据。 - georg
@georg,您能否详细说明一下itertools.ifilter的用法? - Sebastián Vansteenkiste
哦!我没意识到你指的是 filter 函数,是的,这对于编写某些东西更方便。我应该开始关注性能,到目前为止,我已经尽可能使生成器表达式易读,但在我坐下来用时钟测量之前,我可能不知道我的解决方案是否“足够好”。 - Sebastián Vansteenkiste

12
你是指像这样的东西吗:-
item_list = [item for item in items if item > 3]

或者,你可以使用Generator表达式,它不会创建一个新的列表,而是返回一个生成器,然后使用yield方法在每次迭代中返回下一个元素:

for item in (item for item in items if item > 3):
    # Do your task

@J.F.Sebastian 对不起,应该在for后面加上if - Rohit Jain

5

您在问题中提到的没有特殊的语法,但是您可以在for循环中使用if语句,就像在其他任何编程语言中一样:

for item in items:
    if item > 3:
        # Your logic here

或者使用一个守卫条件(就像其他任何语言一样):
for item in items:
    if not (item > 3): continue

    # Your logic here

这两种乏味的方法几乎和特殊语法一样简洁易读。

使用生成器表达式的最佳解决方案更加功能强大,并且可以在for表达式的行上准确指示列表包含的内容。 - Neil

3

Python 3和Python 2.7都有filter()函数,允许从列表中提取那些一个函数(在下面的示例中为lambda函数)返回True的项:

>>> nums=[1,2,3,4,5,6,7,8]
>>> for item in filter(lambda x: x>5,nums):
...     print(item)
... 
6
7
8

filter()中省略函数将提取仅为True的项目,如在pydoc filter中所述。

2
您可以使用显式的 if 语句:
for item in items:
    if item > 3:
       # ...

如果您需要稍后迭代名称,也可以创建一个生成器,示例

filtered_items = (n for n in items if n > 3)

或者你可以将它传递给一个函数:

total = sum(n for n in items if n > 3)

可能是个人喜好的问题,但我觉得将for循环与内联生成表达式结合使用,例如for x in (y for y in items if y > 3):,与上述选项相比显得很丑陋。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接