2010-11-06 14 views

risposta

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

grazie, è stato molto veloce! –

+0

Mi ricorda itertools.compress, ma fa zip invece di enumerare. –

+0

just 'if e' funziona pure – keyser

6

Dal THC4k menzionato compressa (disponibile in 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] 
+0

+1 per l'intelligenza, nonostante il fatto che la spiegazione praticamente inesistente sia resa ancora più oscura attraverso l'uso dell'ultimo risultato "_" che si lega a un oggetto iteratore che viene passato come argomento alla funzione/tipo 'list()' . – martineau

27

Non proprio una "nuova" risposta, ma numpy ha questo costruito in pure.

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] 
+0

È fantastico! Avevo bisogno di questo per un po 'di scripting Python in Cinema-4D, quindi al momento non aveva senso per una libreria solo per questo. Numpy sembra molto bello! Grazie per la condivisione! –

+1

Anche io prefere numpy poi l'altra risposta ... questo è molto più facile da capire ... è più logico, più se vieni da matalb :-) – otmezger

2

Desidero solo aggiungere una spiegazione per l'output "divertente" dal precedente asnwer. Il risultato è una tupla che contiene vettori di indici per ogni dimensione della matrice. In questo caso l'utente sta elaborando ciò che è considerato un vettore in numpy, quindi l'output è tupla con un elemento.

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