2012-10-20 55 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