web-dev-qa-db-ja.com

リスト内の非ゼロ要素のインデックスのリストを取得するにはどうすればよいですか?

常に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

これを達成するための「Pythonの」方法は何でしょうか?

33
George Profenza
[i for i, e in enumerate(a) if e != 0]

実際には「新しい」答えではありませんが、 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]
31
Brian Larsen

THC4kがcompressに言及しているため(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]
6
John La Rooy

前のasnwerからの「面白い」出力の説明を追加したいだけです。結果は、行列の各次元のインデックスのベクトルを含むタプルです。この場合、ユーザーはnumpyでベクトルと見なされるものを処理しているため、出力は1つの要素を含むタプルです。

import numpy as np
a = [0, 1, 0, 1, 0, 0, 0, 0]
nonzeroind = np.nonzero(a) 
print nonzeroind
(array([1, 3]),)
3
Lexa