web-dev-qa-db-fra.com

Python utilisant la compréhension énumérée à l'intérieur d'une liste

Supposons que j'ai une liste comme celle-ci:

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

Pour obtenir les valeurs imprimées avec leur index, je peux utiliser la fonction enumerate de Python comme ceci

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

Maintenant, quand j'essaye de l'utiliser dans un list comprehension, cela me donne cette erreur

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

Ma question est donc la suivante: quelle est la bonne façon d’utiliser la compréhension de liste interne?

110
RanRag

Essaye ça:

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

Vous devez mettre i,j dans un tuple pour que la compréhension de la liste fonctionne. Sinon, étant donné que enumerate() déja renvoie un tuple, vous pouvez le retourner directement sans le décompresser au préalable:

[pair for pair in enumerate(mylist)]

Dans les deux cas, le résultat renvoyé est celui attendu:

> [(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]
145
Óscar López

Juste pour être vraiment clair, cela n’a rien à voir avec enumerate et tout à voir avec la syntaxe de compréhension de liste.

Cette compréhension de la liste retourne une liste de tuples:

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

ceci une liste de dicts:

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

une liste de listes:

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

une erreur de syntaxe:

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

Qui est incohérent (IMHO) et déroutant avec la syntaxe de compréhension de dictionnaire:

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

Et un ensemble de tuples:

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

Comme le disait Óscar López, vous pouvez simplement passer directement l’énumération Tuple:

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

Ou, si vous n'insistez pas pour utiliser une liste de compréhension:

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

Si vous utilisez de longues listes, il semble que la compréhension de la liste est plus rapide, pour ne pas dire plus lisible.

~$ 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
11
beardc

Voici un moyen de le faire:

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

Alternativement, vous pouvez faire:

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

La raison pour laquelle vous avez eu une erreur est que vous aviez oublié le () autour de i et j pour en faire un tuple.

8
Simeon Visser

Soyez explicite sur les tuples.

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

Tous répondent bien les gars. Je sais que la question ici est spécifique au recensement, mais qu'en est-il de quelque chose comme ça, juste une autre perspective

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

Il devient plus puissant s'il faut parcourir plusieurs listes en parallèle en termes de performances. Juste une pensée

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

Comment gérer si la liste myliste = ["a", "b", ["x", "y"], "d"]

0
user3347931