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?
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')]
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')]
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')]
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
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.
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)
Comment gérer si la liste myliste = ["a", "b", ["x", "y"], "d"]