español - Python usando enumerar dentro de la lista de comprensión
python list comprehension tutorial (7)
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, puedes hacer:
>>> [(i, j) for i, j in enumerate(mylist)]
[(0, ''a''), (1, ''b''), (2, ''c''), (3, ''d'')]
La razón por la que recibiste un error fue que echaste de menos el () alrededor de i
y j
para convertirlo en una tupla.
Supongamos que tengo una lista como esta:
mylist = ["a","b","c","d"]
Para obtener los valores impresos junto con su índice, puedo usar la función de enumerate
de Python como esta
>>> for i,j in enumerate(mylist):
... print i,j
...
0 a
1 b
2 c
3 d
>>>
Ahora, cuando trato de usarlo dentro de una 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?
O bien, si no insiste en usar una lista de comprensión:
>>> mylist = ["a","b","c","d"]
>>> list(enumerate(mylist))
[(0, ''a''), (1, ''b''), (2, ''c''), (3, ''d'')]
Para ser muy claros, esto no tiene nada que ver con enumerate
y todo lo relacionado con la sintaxis de comprensión de listas.
Esta lista de comprensión devuelve una lista de tuplas:
[(i,j) for i in range(3) for j in ''abc'']
esta es 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 inconsistente (en mi humilde opinión) y confuso con la sintaxis de comprensión del diccionario:
>>> {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 dijo Óscar López, puedes pasar la tupla enumerate directamente:
>>> [t for t in enumerate(''abcdef'') ]
[(0, ''a''), (1, ''b''), (2, ''c''), (3, ''d''), (4, ''e''), (5, ''f'')]
Prueba esto:
[(i, j) for i, j in enumerate(mylist)]
Debes poner i,j
dentro de una tupla para que funcione la comprensión de la lista. Alternativamente, dado que enumerate()
ya devuelve una tupla, puede devolverla directamente sin desempaquetarla primero:
[pair for pair in enumerate(mylist)]
De cualquier manera, el resultado que se devuelve es el esperado:
> [(0, ''a''), (1, ''b''), (2, ''c''), (3, ''d'')]
Sea explícito sobre las tuplas.
[(i, j) for (i, j) in enumerate(mylist)]
Si usa listas largas, parece que la comprensión de la lista es más rápida, sin mencionar que es más legible.
~$ 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
Toda una gran respuesta chicos. Sé que la pregunta aquí es específica para la enumeración, pero ¿qué tal algo así, simplemente otra perspectiva
from itertools import izip, count
a = ["5", "6", "1", "2"]
tupleList = list( izip( count(), a ) )
print(tupleList)
Se vuelve más poderoso, si uno tiene que iterar múltiples 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)