Hmmm. Hubo una respuesta con una lista de comprensión aquí, pero desapareció.
aquí:
[i for i,x in enumerate(testlist) if x == 1]
Ejemplo:
>>> testlist
[1, 2, 3, 5, 3, 1, 2, 1, 6]
>>> [i for i,x in enumerate(testlist) if x == 1]
[0, 5, 7]
Actualización:
bien, que desea una expresión generadora, tendremos una expresión generadora. Aquí está la lista por comprensión de nuevo, en un bucle for:
>>> for i in [i for i,x in enumerate(testlist) if x == 1]:
... print i
...
0
5
7
Ahora vamos a construir un generador ...
>>> (i for i,x in enumerate(testlist) if x == 1)
<generator object at 0x6b508>
>>> for i in (i for i,x in enumerate(testlist) if x == 1):
... print i
...
0
5
7
y niftily suficiente, podemos asignar a una variable que, y lo utilizan a partir de ahí ...
>>> gen = (i for i,x in enumerate(testlist) if x == 1)
>>> for i in gen: print i
...
0
5
7
Y pensar que solía escribir FORTRAN.
Esta es la mejor respuesta aquí, IMO. Es claro y sucinto, y realmente captura los valores de índice, por lo que es extensible (puede imprimirlos, pasarlos a otra función, etc.) La única mejora es usar una expresión de generador para casos con muchas coincidencias. http://is.gd/brzl – gotgenes
Después de probablemente 25 años de cuestionar la programación funcional, creo que finalmente tengo la pista. la comprensión de la lista es da bomb. –
Las variables de una sola palabra hacen que sea más difícil comprender su código, especialmente en ejemplos de programación. – mikemaccana