Как получить список индексов ненулевых элементов в списке? - PullRequest
32 голосов
/ 06 ноября 2010

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

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

Каким был бы «питонный» способ достижения этого?

Ответы [ 4 ]

63 голосов
/ 06 ноября 2010
[i for i, e in enumerate(a) if e != 0]
31 голосов
/ 27 мая 2011

Не совсем "новый" ответ, но 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]
6 голосов
/ 06 ноября 2010

Поскольку 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]
3 голосов
/ 13 декабря 2016

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

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