Подтвердить что ты не робот

Как получить список индексов ненулевых элементов в списке?

У меня есть список, который всегда будет содержать только единицы и нули. Мне нужно получить список ненулевых индексов списка:

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

Каким будет "питонический" способ достижения этого?

4b9b3361

Ответ 1

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

Ответ 2

Не совсем "новый" ответ, но 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]

Ответ 3

Так как 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]

Ответ 4

Просто хотел добавить объяснение для "смешного" вывода из предыдущего asnwer. Результат - это кортеж, который содержит векторы индексов для каждого измерения матрицы. В этом случае пользователь обрабатывает то, что считается вектором в numpy, поэтому вывод является кортежем с одним элементом.

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