2008-12-13 19 views

Respuesta

222

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.

+0

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

+5

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. –

+0

Las variables de una sola palabra hacen que sea más difícil comprender su código, especialmente en ejemplos de programación. – mikemaccana

10
for i in xrange(len(testlist)): 
    if testlist[i] == 1: 
    print i 

xrange en lugar de gama como solicitado (ver comentarios).

+0

reemplazar rango() con xrange() - rango() crea una lista, xrange() crea un iterador. xrange() usa menos memoria, y la llamada inicial es más rápida. – gnud

+2

Acepto listas grandes en programas de python 2. Tenga en cuenta que el 'rango' aún funcionará en Python 3 (y funciona como xrange IIRC). 'xrange' sigue el camino de los dinosaurios. – jakber

+0

Actualización: 'xrange' se despractó en Python 3.x, como el nuevo' range' es el antiguo 'xrange' –

39

uso de enumeración:

testlist = [1,2,3,5,3,1,2,1,6] 
for position, item in enumerate(testlist): 
    if item == 1: 
     print position 
1

Si su lista tiene bastante grande y sólo se espera encontrar el valor en un escaso número de índices, tenga en cuenta que este código podría ejecutar mucho más rápido porque no lo hace tiene que iterar cada valor en la lista.

lookingFor = 1 
i = 0 
index = 0 
try: 
    while i < len(testlist): 
    index = testlist.index(lookingFor,i) 
    i = index + 1 
    print index 
except ValueError: #testlist.index() cannot find lookingFor 
    pass 

Si usted espera encontrar el valor de muchas cosas que se debe probablemente sólo añadir "índice" de una lista e imprimir la lista al final de ahorrar tiempo por iteración.

+0

Hice algunas pruebas de tiempo. La técnica de comprensión de listas funciona un 38% más rápido que este código. (Reemplacé su declaración de impresión con una llamada a la lista de salida.append) – Deestan

+0

También hice algunas pruebas con tamaños de lista de 100000 valores aleatorios entre 1 y 100. El código que escribí fue en algunos casos el doble de rápido. Ninguna prueba de tiempo es comparable a la aplicación del póster (deben probarse para estar seguros, por supuesto). Me disculpo si mi opinión fue perjudicial para esta publicación. –

-2
testlist = [1,2,3,5,3,1,2,1,6] 
for id, value in enumerate(testlist): 
    if id == 1: 
     print testlist[id] 

Supongo que es exactamente lo que quiere. ;-) 'id' será siempre el índice de los valores en la lista.

3

Aquí hay otra manera de hacer esto:

try: 
    id = testlist.index('1') 
    print testlist[id] 
except: 
    print "Not Found" 
111

¿Qué hay de la siguiente?

print testlist.index(element) 

Si no está seguro de si el elemento a buscar es en realidad en la lista, puede agregar una comprobación preliminar, como

if element in testlist: 
    print testlist.index(element) 

o

print(testlist.index(element) if element in testlist else None) 

o el " manera pitónica ", que no me gusta tanto porque el código es menos claro, pero a veces es más eficiente,

try: 
    print testlist.index(element) 
except ValueError: 
    pass 
+5

en lugar de probar antes de acceder, también puede intente y compruebe si 'ValueError' – kratenko

+0

Creo que quiere encontrar todas las ocurrencias, parece que solo da la primera. – tfv

+0

@tfv No veo cómo puede llegar a tal conclusión ya que la pregunta dice "elemento" y no "elementos". – mmj

2
[x for x in range(len(testlist)) if testlist[x]==1] 
0

creo que podría ser útil utilizar el método curselection() de la biblioteca thte Tkinter:

from Tkinter import * 
listbox.curselection() 

Este método funciona en el cuadro de lista de widgets Tkinter, por lo que necesita para construir una de ellas en lugar de una lista

Esto devolverá una posición como esta:

('0',) (aunque las versiones posteriores de Tkinter pueden devolver una lista de enteros en su lugar)

que es para la primera posición y la el número cambiará según la posición del artículo.

Para obtener más información, consulte esta página: http://effbot.org/tkinterbook/listbox.htm

saludos.

+0

Interesante idea. Sin embargo, dado que esto requiere importar toda la biblioteca de Tkinter, no es la forma más eficiente de resolver el problema. – seaotternerd

+2

Este es un camino tan ineficiente y serpenteante que diría que es una respuesta incorrecta, incluso si de alguna manera aborda la cuestión. –

+0

Esta respuesta no tiene nada que ver con la pregunta. –

0

¿Por qué complicar las cosas?

testlist = [1,2,3,5,3,1,2,1,6] 
for position, item in enumerate(testlist): 
    if item == 1: 
     print position 
Cuestiones relacionadas