39

Python有类似下面的东西吗?

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

我的意思是 Python 2.7 和 Python 3.3 都在一起。

4

5 回答 5

67

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

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)
于 2012-10-20T09:21:18.043 回答
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
于 2012-10-20T09:18:57.747 回答
5

没有像where您的问题中那样的特殊语法,但您始终可以if在循环中使用语句for,就像使用任何其他语言一样:

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

或保护条款(再次,像任何其他语言一样):

for item in items:
    if not (item > 3): continue

    # Your logic here

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

于 2012-10-20T09:38:21.510 回答
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

省略函数 infilter()将仅提取True中所述的项目pydoc filter

于 2017-06-09T21:16:27.330 回答
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 x in (y for y in items if y > 3):上述选项相比,与内联的genexpr 相结合的for循环很难看。

于 2012-10-20T09:51:22.027 回答