web-dev-qa-db-fra.com

Comment obtenir une liste d'indices d'éléments non nuls dans une liste?

J'ai une liste qui ne contiendra toujours que des uns et des zéros. J'ai besoin d'obtenir une liste des indices non nuls de la liste:

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

Quelle serait la manière "pythonique" d'y parvenir?

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

Pas vraiment une "nouvelle" réponse mais numpy a également intégré cela.

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

Depuis THC4k mentionné compresser (disponible en 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

Je voulais juste ajouter une explication pour la sortie "drôle" de la réponse précédente. Le résultat est un Tuple qui contient des vecteurs d'index pour chaque dimension de la matrice. Dans ce cas, l'utilisateur traite ce qui est considéré comme un vecteur dans numpy, donc la sortie est Tuple avec un élément.

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