我试图弄清楚是否有办法在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]
对于较大的列表,是否有更高效的内容?
答案 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)
我认为你已经以正确的方式做到了。