2012-10-20 23 views

回答

37

您可以用generator expression循环相结合:

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

itertools.ifilter是另一种选择 - 甚至当效率很重要时也是最好的选择,例如,在一个大的数据集上。

+4

由于没有生成中间数组,因此这是正确的方法。这被称为生成器表达式。国际海事组织它的遗憾,你不能只写一个更短的'for x in items in if> 10:'虽然。 –

+0

@迈克尔安德森:是的,那会很整齐。据说这种语法已被Guido拒绝,但我还没有找到证据。 – georg

7

你的意思是这样的: -

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 
+0

@Downvoter中所述..为什么downvote? downvoter可以评论吗? –

+0

这是错误的.. –

+0

@ J.F.Sebastian对不起,应该有'如果'之后。 –

2

没有像你的问题where一种特殊的语法,但你总是可以只使用for环路内的if声明,就像你会在任何其他语言:

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

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

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

    # Your logic here 

这些无聊的方法两者都是几乎一样的简洁性和可读性为这个特殊的语法会。

+0

带有生成器表达式的顶级解决方案功能更强大,并且准确指出列表包含在for表达式的行中。 – Neil

+0

@尼尔我不认为这是一个downvote。 “更多功能”是否是好事是味道的问题。这种方法使用额外的代码行,在某些情况下可能看起来冗长;单行生成器将初始序列和谓词表达式的表达式压缩到一行(并且引入了一个额外的'for x in'),如果序列表达式和谓词表达式是可能尝试在一行上插入太多长。生成器方法还使用新手可能不熟悉的语言功能。哪一个最好取决于背景和观众。 –

2

你可以使用一个明确的if声明:

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

或者,如果你需要一个名字以后迭代,你可以创建一个发电机,example

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

或者你可以把它作为一个功能:

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

这可能是味道的问题,但我f与上述选项相比,将内嵌genexpr与for x in (y for y in items if y > 3):结合在一起的for-loop与丑陋相比更加难看。

0

的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