Python列表中的非零元素列表

时间:2013-05-27 14:32:05

标签: python list

给出清单

a = [6, 3, 0, 0, 1, 0]

Python返回列表的最佳方法是什么

b = [1, 1, 0, 0, 1, 0]

其中b中的1对应于a中的非零元素。我可以考虑运行for循环并简单地附加到b上,但我确信必须有更好的方法。

7 个答案:

答案 0 :(得分:10)

列表理解方法:

a = [6, 3, 0, 0, 1, 0]
b = [1 if i else 0 for i in a]
print b
>>> 
[1, 1, 0, 0, 1, 0]

我的时间,Dave's methodLattyware's slight alteration

$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[1 if i else 0 for i in a]"
1000000 loops, best of 3: 0.838 usec per loop
$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[int(i != 0) for i in a]"
100000 loops, best of 3: 2.15 usec per loop
$ python3 -m timeit -s "a = [6, 3, 0, 0, 1, 0]" "[i != 0 for i in a]"
1000000 loops, best of 3: 0.794 usec per loop

看起来我的方法速度快了两倍......我真的很惊讶 要快得多。但是,取出int()调用会使两者基本相同 - 但会使结果列表中的Booleans而不是Integers(True / False而不是1/0)

答案 1 :(得分:5)

b = [int(i != 0) for i in a]

会给你你想要的东西。

答案 2 :(得分:2)

为了完整性,并且因为没有其他人添加这个答案:

b = map(bool, a)

但它返回布尔值而不是整数。

答案 3 :(得分:1)

怎么样

>>> a = [6, 3, 0, 0, 1, 0]

>>> [bool(x) for x in a]
[True, True, False, False, True, False]

>>> [int(bool(x)) for x in a]
[1, 1, 0, 0, 1, 0]

根据您的需要,使用布尔列表可能会更好。

答案 4 :(得分:1)

另一种方式

>>> a = [6, 3, 0, 0, 1, 0]

>>> [cmp(x,0) for x in a]
[1, 1, 0, 0, 1, 0]

请注意,cmp(x,0)会为负数返回-1,因此您可能需要abs

答案 5 :(得分:1)

根据您的应用程序,您还可以使用numpy数组表示法:

$ import numpy as np
$ a = [6, 3, 0, 0, 1, 0]
$ (np.array(a)!= 0).astype(int)
array([1, 1, 0, 0, 1, 0])
只有你不想要一个布尔表示

时才需要

astype(int)

答案 6 :(得分:0)

对于它的另一种方式:

[{0: 0}.get (el, 1) for el in your_list]