2010-11-06 14 views

Respuesta

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

gracias, que era muy rápido! –

+0

Me recuerda a itertools.compress, pero se comprime en lugar de enumerar. –

+0

simplemente 'if e' también funciona – keyser

6

Desde THC4k mencionó compresa (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] 
+0

+1 por astucia, a pesar de que la explicación prácticamente inexistente se hace aún más oscura mediante el uso del "_" último enlace de resultados a un objeto iterador que se pasa como argumento a la función/tipo 'list()' . – martineau

27

No es realmente un "nuevo" respuesta, pero numpy ha construido en este también.

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

¡Eso es genial! Necesitaba esto para un poco de scripts de Python en Cinema-4D, por lo que en ese momento no tenía sentido para una biblioteca solo por esto. numpy se ve muy bien! ¡Gracias por compartir! –

+1

También prefiero numpy luego la otra respuesta ... esto es mucho más fácil de entender ... es más lógico, más si vienes de matalb :-) – otmezger

2

Acabo de querer agregar la explicación para la salida 'divertida' de la anterior asnwer. El resultado es una tupla que contiene vectores de índices para cada dimensión de la matriz. En este caso, el usuario está procesando lo que se considera un vector en numpy, por lo que la salida es 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]),) 
Cuestiones relacionadas