使用布尔值创建一个列表,该列表表示应用于列表时谓词的结果

时间:2011-06-06 23:00:24

标签: python python-3.x list-comprehension

我试图弄清楚是否有办法在Python 3中通过比较获得逻辑列表。 基本上我想要输入的是

x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
xlist = 4 <= x

我想要输出的是一个看起来像这样的列表

xlist = [False, False, False, True, True, True, True, True, True]

无论如何,如果不使用像

这样的列表理解,就可以做到这一点
xlist = [4 <= i for i in x]

对于较大的列表,是否有更高效的内容?

6 个答案:

答案 0 :(得分:5)

列表理解确实没有错。这正是列表推导的设计目的。

如果你正在使用NumPy(或SciPy),你正在寻找的语法确实有效:

from numpy import array

...

x = array([1,2,3,4,5,6,7,8,9])
xlist = 4<=x

但是如果你还没有充分的理由使用NumPy,那么仅仅为了这个语法就不值得。无论如何,想一想我还不确定NumPy是否适用于Python 3。

答案 1 :(得分:4)

要考虑的一件事是你是否需要中间名单。如果不使用generator expression代替。例如,all(i <= 4 for i in x)速度会快得多,并且使用的内存将少于all([i <= 4 for i in x])

答案 2 :(得分:2)

地图方法可能会更快,但,如果您真的想知道,请对其进行描述。

还要考虑阵列模块。

In [2]: %timeit map(lambda i: 4<=i, xrange(1,100))
100000 loops, best of 3: 15.9 us per loop

In [7]: %timeit list(4<=i for i in range(1,100))
100000 loops, best of 3: 10.3 us per loop

In [8]: %timeit list(4<=i for i in range(1,1000))
10000 loops, best of 3: 80.6 us per loop

In [10]: %timeit map(lambda i: 4<=i, xrange(1,1000))
10000 loops, best of 3: 155 us per loop

答案 3 :(得分:1)

对于大型列表,请执行以下操作:

>>> (4<=i for i in range(1,10))
<generator object <genexpr> at 0xb75beedc>
>>> list(_)
[False, False, False, True, True, True, True, True, True]
# The list(_) is just to show what is inside the generator...

优于:

>>> [4<=i for i in range(1,10)]
[False, False, False, True, True, True, True, True, True]

据我所知,Python 3与Python 2中的列表理解与生成器理解相比,速度优势要小得多。这种语法适用于两者,大型列表的优点是相同的:列表元素都是根据需要生成一次生成与生成器。

答案 4 :(得分:1)

您还可以使用以下内容:

print map(lambda i: 4<=i, xrange(1,10))

答案 5 :(得分:0)

我认为你已经以正确的方式做到了。