2012-05-27 41 views
96

vamos a suponer que tengo una lista como esta:Python usando enumerar dentro de la lista de comprensión

mylist = ["a","b","c","d"] 

para obtener los valores impresos junto con su índice puedo usar la función de Python enumerate como esto

>>> for i,j in enumerate(mylist): 
...  print i,j 
... 
0 a 
1 b 
2 c 
3 d 
>>> 

Ahora , cuando trato de usarlo dentro de un list comprehension me da este error

>>> [i,j for i,j in enumerate(mylist)] 
    File "<stdin>", line 1 
    [i,j for i,j in enumerate(mylist)] 
     ^
SyntaxError: invalid syntax 

Entonces, mi pregunta es: ¿cuál es la forma correcta de usar enumerar dentro de la lista de comprensión?

Respuesta

128

Prueba esto:

[(i, j) for i, j in enumerate(mylist)] 

Es necesario poner i,j dentro de una tupla para la comprensión de lista para trabajar. Por otra parte, dado que enumerate()ya devuelve una tupla, puede volver directamente sin desembalar primero:

[pair for pair in enumerate(mylist)] 

De cualquier manera, el resultado de que es retornada es el esperado:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 
+4

No es obligatorio ser una tupla. Cualquier expresión que use i y j que devuelva un valor hará – Alvaro

+0

el uso de la enumeración es excelente, ¿qué tal si lo hace más eficiente usando itertools – Pramit

+1

? Recuerde que una tupla está compuesta por ',' ** not ** the '()' . Entonces "poner' i, j' dentro de una tupla "no tiene sentido, ya que' i, j' ya es una tupla! El problema es que el analizador comp de la lista necesita los parens para el grupo de instrucciones. – cowbert

8

Aquí hay una manera de hacerlo:

>>> mylist = ['a', 'b', 'c', 'd'] 
>>> [item for item in enumerate(mylist)] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 

Alternativamente, se puede hacer:

>>> [(i, j) for i, j in enumerate(mylist)] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 

La razón por la que obtuvo un error era que carecían del() alrededor de ij y para que sea una tupla.

5

Sea explícito sobre las tuplas.

[(i, j) for (i, j) in enumerate(mylist)] 
29

O, si no insiste en usar una lista por comprensión:

>>> mylist = ["a","b","c","d"] 
>>> list(enumerate(mylist)) 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')] 
37

sólo para estar muy claro, esto no tiene nada que ver con enumerate y todo que ver con la sintaxis de lista por comprensión.

Esta lista por comprensión devuelve una lista de tuplas:

[(i,j) for i in range(3) for j in 'abc'] 

presente una lista de dicts:

[{i:j} for i in range(3) for j in 'abc'] 

una lista de listas:

[[i,j] for i in range(3) for j in 'abc'] 

un error de sintaxis:

[i,j for i in range(3) for j in 'abc'] 

que es incompatible (en mi humilde opinión) y confuso con el diccionario por comprensión sintaxis:

>>> {i:j for i,j in enumerate('abcdef')} 
{0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'} 

y un conjunto de tuplas:

>>> {(i,j) for i,j in enumerate('abcdef')} 
set([(0, 'a'), (4, 'e'), (1, 'b'), (2, 'c'), (5, 'f'), (3, 'd')]) 

Como se indicó Óscar López, que sólo puede pasar la tupla de enumeración directa:

>>> [t for t in enumerate('abcdef') ] 
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')] 
11

Si está utilizando listas largas, parece que la lista de comprensión es más rápida, por no mencionar más Dable.

~$ python -mtimeit -s"mylist = ['a','b','c','d']" "list(enumerate(mylist))" 
1000000 loops, best of 3: 1.61 usec per loop 
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[(i, j) for i, j in enumerate(mylist)]" 
1000000 loops, best of 3: 0.978 usec per loop 
~$ python -mtimeit -s"mylist = ['a','b','c','d']" "[t for t in enumerate(mylist)]" 
1000000 loops, best of 3: 0.767 usec per loop 
+2

+1 No lo probé, pero apuesto que '[t para t en enumerate (mi lista)]' es aún más rápido. –

+0

Acabo de actualizarlo. Tienes razón. – beardc

0

All great answer guys. Sé que la pregunta aquí es específico de la enumeración, pero ¿qué tal algo como esto, sólo otra perspectiva

from itertools import izip, count 
a = ["5", "6", "1", "2"] 
tupleList = list(izip(count(), a)) 
print(tupleList) 

se vuelve más poderosa, si se tiene que repetir varias listas en paralelo en términos de rendimiento. Solo un pensamiento

a = ["5", "6", "1", "2"] 
b = ["a", "b", "c", "d"] 
tupleList = list(izip(count(), a, b)) 
print(tupleList) 
Cuestiones relacionadas