2009-09-22 49 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会做的明显的方式)