2010-01-15 5 views
13

Je me surprends souvent à écrire du code comme ceci:Comment obtenir l'index et l'élément de liste simultanément dans Python?

k = 0 
for i in mylist: 
    # y[k] = some function of i 
    k += 1 

Au lieu de cela, je pouvais faire

for k in range(K): 
    # y[k] = some function of mylist[k] 

mais cela ne semble pas "pythonique". (Vous savez ... indexation Ick!) Existe-t-il une syntaxe qui me permet d'extraire simultanément l'index (k) et l'élément (i) en utilisant soit une boucle, soit une compréhension de liste, soit un générateur? La tâche est dans l'informatique scientifique, donc il y a beaucoup de choses dans le corps de la boucle, rendant une compréhension de la liste probablement pas assez puissante en soi, je pense.

Je me réjouis également des conseils sur des concepts connexes, que je n'ai peut-être même pas. Je vous remercie.

Répondre

38

Vous pouvez utiliser enumerate:

for k,i in enumerate(mylist): 
    #do something with index k 
    #do something with element i 

Plus d'informations sur looping techniques.

Edit:
Comme indiqué dans les commentaires, en utilisant d'autres noms de variables comme

for i, item in enumerate(mylist): 

rend plus facile à lire et à comprendre votre code à long terme. Normalement, vous devez utiliser i, j, k pour les nombres et meaningful variable names pour décrire les éléments d'une liste.
I.e. si vous avez par exemple une liste de livres et itérer dessus, alors vous devriez nommer la variable book.

+3

vous permet également Énumérer de commencer l'index où vous aimez en utilisant le paramètre de démarrage. C'est assez pratique parfois. http://docs.python.org/library/functions.html#enumerate – jps

+1

Il se peut que je sois seul, mais utiliser 'i' comme variable pour contenir chaque élément de l'itérable me rejetterait en lisant ce code. Les noms de variables standard «i» et «j» ne sont-ils pas assez courants pour les index en boucle? –

+1

@Will: Je suis d'accord, je l'ai juste utilisé car l'OP utilise cette relation dans sa question. –

15

enumerate est la réponse:

for index, element in enumerate(iterable): 
    #work with index and element 
Questions connexes