2009-09-22 47 views
0

我有一個整數列表,我想創建一個新的列表,所有元素都小於給定的限制。在Python中的詳細列表理解

a=range(15) #example list 
limit=9 #example limit 

我對解決這個問題的方法是

[i for i in a if i < limit] 

對我來說,開始「我爲我在」看起來相當冗長。在Python中是否有更好的實現?

+3

什麼是* *更好? – SilentGhost 2009-09-22 14:39:31

+0

「相當詳細」?你怎麼能夠以一般的方式來減少這種情況?請提供您的首選語法。你期望什麼? – 2009-09-22 14:41:38

+0

@SilentGhost:與往常一樣,Python中的'better'一詞意味着遵循Python的Zen。 – Roland 2009-09-22 14:58:08

回答

4

你可以使用filter

>>> filter(lambda i: i < limit, a) 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 

但列表內涵是做

這裏的首選方法是什麼python docs不得不說的是:

列表解析提供了一個簡明的 使用map(),filter()和/或()創建列表的方式不需要使用 10 lambda。結果清單定義 往往比使用這些結構構建的清單 更清晰。

+1

這比示例列表理解更長! – Triptych 2009-09-22 17:11:18

1

您可以使用過濾器()(至少在Python 2.x的系列...我認爲這可能會在3.0被移除)

newlist = filter(lambda item: item < limit, oldlist) 

的第一個參數可以是任何可調用(它的結果將被強制爲boolean,因此最好使用返回布爾值的callable),第二個參數可以是任何序列。

2

這是關於你可以做的最好的。你可以用過濾器做得更好,但我不會推薦它。請記住,列表理解讀取幾乎像英語:「我爲我在一個如果我的<限制」。這使得它更容易閱讀和理解,如果在冗長的一面。

0

更好的版本需要樣板代碼,所以列表理解是一樣好,你可以得到。

這將是一個不同的方式做到這一點:

from operator import ge 
from functools import partial 

filter(partial(ge, limit), a) 

(但如果你使用filterNadia's way會做的明顯的方式)