如何获取列表中非零元素的索引列表?

Geo*_*nza 34 python list-comprehension list

我有一个列表,它将始终只包含1和0.我需要获得列表的非零索引列表:

a = [0, 1, 0, 1, 0, 0, 0, 0]
b = []
for i in range(len(a)):
    if a[i] == 1:  b.append(i)
print b
Run Code Online (Sandbox Code Playgroud)

实现这一目标的"pythonic"方式是什么?

Ign*_*ams 67

[i for i, e in enumerate(a) if e != 0]
Run Code Online (Sandbox Code Playgroud)


Bri*_*sen 32

不是真正的"新"答案,但numpy也有内置.

import numpy as np
a = [0, 1, 0, 1, 0, 0, 0, 0]
nonzeroind = np.nonzero(a)[0] # the return is a little funny so I use the [0]
print nonzeroind
[1 3]
Run Code Online (Sandbox Code Playgroud)


Joh*_*ooy 6

由于THC4k提到压缩(在python2.7 +中可用)

>>> from itertools import compress, count
>>> x = [0, 1, 0, 1, 0, 0, 0, 0]
>>> compress(count(), x)
<itertools.compress object at 0x8c3666c>   
>>> list(_)
[1, 3]
Run Code Online (Sandbox Code Playgroud)


小智 6

只是想为上一个答案的“有趣”输出添加解释。结果是一个元组,其中包含矩阵每个维度的索引向量。在这种情况下,用户正在处理 numpy 中被视为向量的内容,因此输出是具有一个元素的元组。

import numpy as np
a = [0, 1, 0, 1, 0, 0, 0, 0]
nonzeroind = np.nonzero(a) 
print nonzeroind
(array([1, 3]),)
Run Code Online (Sandbox Code Playgroud)