Python列表中的非零元素列表

rwo*_*lst 5 python list

鉴于清单

a = [6, 3, 0, 0, 1, 0]
Run Code Online (Sandbox Code Playgroud)

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

b = [1, 1, 0, 0, 1, 0]
Run Code Online (Sandbox Code Playgroud)

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

Inb*_*ose 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]
Run Code Online (Sandbox Code Playgroud)

我的时间,Dave的方法Lattyware的轻微改动:

$ 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
Run Code Online (Sandbox Code Playgroud)

貌似我的方法是快两倍......我其实感到惊讶是那个要快得多.int()然而,取出调用会使两者基本相同 - 但是将结果列表保留为完全Booleans而不是Integers(True/False而不是1/0)


dav*_*ave 5

b = [int(i != 0) for i in a]
Run Code Online (Sandbox Code Playgroud)

会给你你想要的东西.