2009-08-15 4 views
8

J'ai bidouiller un peu avec Python, et je l'ai compris que c'est généralement mieux (ou « pythonique ») à utiliserAccès aux éléments avec des décalages en Python pour .. dans les boucles

for x in SomeArray: 

plutôt que plus de style C

for i in range(0, len(SomeArray)): 

je vois les avantages dans ce domaine, principalement le code plus propre, et la possibilité d'utiliser les fonctions agréables map() et connexes. Cependant, je suis souvent confronté à la situation où je voudrais accéder simultanément à des éléments de décalages différents dans le tableau. Par exemple, je pourrais vouloir ajouter l'élément en cours à l'élément en deux étapes. Y a-t-il un moyen de le faire sans recourir à des indices explicites?

+1

Notez que la plage (0, len (SomeArray)) est équivalente à la plage plus habituelle (len (SomeArray)). – EOL

Répondre

14

La façon de le faire dans le python est:

for i, x in enumerate(SomeArray): 
    print i, x 

Le générateur enumerate produit une séquence de 2-uplets, chacun contenant l'index de tableau et l'élément.

+0

Mais comment accéder aux éléments précédents/suivants dans une itération de la boucle? – int3

+0

A l'intérieur de la boucle, vous pouvez accéder à SomeArray [i-1] ou à SomeArray [i + 1]. –

+0

'SomeArray [i-1]'? Mais vous pourriez vouloir expliquer ce que vous faites réellement – SilentGhost

6

La liste d'indexation et zip() sont vos amis.

Voilà ma réponse à votre question plus précise:

je pourrais vouloir ajouter l'élément courant à l'élément à deux pas derrière elle. Y a-t-il un moyen de le faire sans recourir à des indices explicites?

arr = range(10) 
[i+j for i,j in zip(arr[:-2], arr[2:])] 

Vous pouvez également utiliser le module numpy si vous avez l'intention de travailler sur des tableaux numériques. Par exemple, le code ci-dessus peut être plus élégamment écrit:

import numpy 
narr = numpy.arange(10) 
narr[:-2] + narr[2:] 

Ajout du n-ième élément à l'élément e (n-2) est équivalente à l'ajout de l'élément de mth à l'élément (m + 2) (pour le mathématiquement incliné, nous avons effectué la substitution n-> m + 2). La plage de n est [2, len (arr)) et la plage de m est [0, len (arr) -2). Notez les parenthèses et les parenthèses. Les éléments de 0 à len (arr) -3 (vous excluez les deux derniers éléments) sont indexés comme [: -2] tandis que les éléments de 2 à len (arr) -1 (vous excluez les deux premiers éléments) est indexé comme [ 2:].

Je suppose que vous connaissez déjà la compréhension des listes.

+0

Oui, je connais les listes de compréhension. Je ne les ai pas vraiment utilisés. zip() ressemble à une autre bonne solution, merci! – int3

Questions connexes