2009-08-15 10 views
8

He estado limpiando un poco con Python, y he deducido que por lo general es mejor (o 'Pythonic') para utilizarelementos con compensaciones en Python que permiten acceder a .. en bucles

for x in SomeArray: 

vez que cuanto más al estilo de C

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

hago ver los beneficios de este código, sobre todo más limpio, y la capacidad de utilizar las buenas map() y funciones relacionadas. Sin embargo, a menudo me enfrento a la situación en la que me gustaría acceder simultáneamente a elementos de diferentes compensaciones en la matriz. Por ejemplo, podría querer agregar el elemento actual al elemento dos pasos detrás de él. ¿Hay alguna manera de hacer esto sin recurrir a índices explícitos?

+1

Tenga en cuenta que el rango (0, len (SomeArray)) es equivalente al rango más habitual (len (SomeArray)). – EOL

Respuesta

14

La manera de hacer esto en Python es:

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

El generador enumerate produce una secuencia de 2-tuplas, cada uno que contiene el índice de la matriz y el elemento.

+0

Pero, ¿cómo podría acceder a elementos anteriores/posteriores en una iteración del ciclo? – int3

+0

Dentro del ciclo, puede acceder a SomeArray [i-1] o SomeArray [i + 1]. –

+0

'SomeArray [i-1]'? Pero es posible que desee explicar lo que realmente está haciendo – SilentGhost

6

Lista de indexación y zip() son sus amigos.

aquí está mi respuesta a su pregunta más específica:

podría desear agregar el elemento actual al elemento de dos pasos detrás de él. ¿Hay alguna manera de hacer esto sin recurrir a índices explícitos?

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

También puede utilizar el módulo numpy si tiene la intención de trabajar en matrices numéricas. Por ejemplo, el código anterior se puede escribir más elegante como:

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

Adición del elemento n-ésimo a la ésimo elemento (n-2) es equivalente a añadir el elemento mth al elemento (m + 2) (para los matemáticamente inclinados, realizamos la sustitución n-> m + 2). El rango de n es [2, len (arr)) y el rango de m es [0, len (arr) -2). Tenga en cuenta los corchetes y paréntesis. Los elementos de 0 a len (arr) -3 (excluyes los dos últimos elementos) se indexan como [: -2] mientras que los elementos de 2 a len (arr) -1 (excluyes los dos primeros elementos) se indexan como [ 2:].

Supongo que ya conoce la lista de comprensiones.

+0

sí, sé listas de comprensión. realmente no los he usado. zip() parece otra buena solución, ¡gracias! – int3

Cuestiones relacionadas