我有一個整數列表,我想創建一個新的列表,所有元素都小於給定的限制。在Python中的詳細列表理解
a=range(15) #example list
limit=9 #example limit
我對解決這個問題的方法是
[i for i in a if i < limit]
對我來說,開始「我爲我在」看起來相當冗長。在Python中是否有更好的實現?
我有一個整數列表,我想創建一個新的列表,所有元素都小於給定的限制。在Python中的詳細列表理解
a=range(15) #example list
limit=9 #example limit
我對解決這個問題的方法是
[i for i in a if i < limit]
對我來說,開始「我爲我在」看起來相當冗長。在Python中是否有更好的實現?
你可以使用filter
>>> filter(lambda i: i < limit, a)
[0, 1, 2, 3, 4, 5, 6, 7, 8]
但列表內涵是做
這裏的首選方法是什麼python docs不得不說的是:
列表解析提供了一個簡明的 使用map(),filter()和/或()創建列表的方式不需要使用 10 lambda。結果清單定義 往往比使用這些結構構建的清單 更清晰。
這比示例列表理解更長! – Triptych 2009-09-22 17:11:18
您可以使用過濾器()(至少在Python 2.x的系列...我認爲這可能會在3.0被移除)
newlist = filter(lambda item: item < limit, oldlist)
的第一個參數可以是任何可調用(它的結果將被強制爲boolean,因此最好使用返回布爾值的callable),第二個參數可以是任何序列。
這是關於你可以做的最好的。你可以用過濾器做得更好,但我不會推薦它。請記住,列表理解讀取幾乎像英語:「我爲我在一個如果我的<限制」。這使得它更容易閱讀和理解,如果在冗長的一面。
更好的版本需要樣板代碼,所以列表理解是一樣好,你可以得到。
這將是一個不同的方式做到這一點:
from operator import ge
from functools import partial
filter(partial(ge, limit), a)
(但如果你使用filter
,Nadia's way會做的明顯的方式)
什麼是* *更好? – SilentGhost 2009-09-22 14:39:31
「相當詳細」?你怎麼能夠以一般的方式來減少這種情況?請提供您的首選語法。你期望什麼? – 2009-09-22 14:41:38
@SilentGhost:與往常一樣,Python中的'better'一詞意味着遵循Python的Zen。 – Roland 2009-09-22 14:58:08