2009-08-15 12 views
8

ho pasticciare un po 'con Python, e ho capito che di solito è meglio (o 'divinatorio') per utilizzareelementi con offset in Python per l'accesso di .. in loop

for x in SomeArray: 

piuttosto che il più C-style

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

faccio vedere i benefici di questo, il codice soprattutto più pulito, e la capacità di utilizzare le belle map() e le relative funzioni. Tuttavia, mi trovo abbastanza spesso di fronte alla situazione in cui vorrei accedere simultaneamente a elementi di offset diversi nell'array. Ad esempio, potrei voler aggiungere l'elemento corrente all'elemento due passi indietro. C'è un modo per farlo senza ricorrere a indici espliciti?

+1

Si noti che l'intervallo (0, len (SomeArray)) è equivalente all'intervallo più comune (len (SomeArray)). – EOL

risposta

14

Il modo per fare questo in Python è:

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

Il generatore enumerate produce una sequenza di 2-tuple, ciascuna contenente l'indice di matrice e l'elemento.

+0

Ma come potrei accedere agli elementi precedenti/successivi in ​​un'unica iterazione del ciclo? – int3

+0

All'interno del loop, è possibile accedere a SomeArray [i-1] o SomeArray [i + 1]. –

+0

'SomeArray [i-1]'? Ma potresti voler spiegare cosa stai facendo effettivamente – SilentGhost

6

Elenco indicizzazione e zip() sono i tuoi amici.

Ecco la mia risposta alla tua domanda più specifica:

potrei voler aggiungere l'elemento corrente all'elemento due passi dietro di esso. C'è un modo per farlo senza ricorrere a indici espliciti?

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

È inoltre possibile utilizzare il modulo numpy se si ha intenzione di lavorare su array numerici. Ad esempio, il codice di cui sopra può essere più elegantemente scritto come:

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

Aggiungendo l'n-esimo elemento all'elemento esimo (n-2) è equivalente ad aggiungere l'elemento mese all'elemento (m + 2) (per l'inclinazione matematica, abbiamo eseguito la sostituzione n-> m + 2). L'intervallo di n è [2, len (arr)) e l'intervallo di m è [0, len (arr) -2). Nota le parentesi e le parentesi. Gli elementi da 0 a len (arr) -3 (si escludono gli ultimi due elementi) sono indicizzati come [: -2] mentre gli elementi da 2 a len (arr) -1 (si escludono i primi due elementi) sono indicizzati come [ 2:].

Suppongo che tu conosca già le comprensioni delle liste.

+0

sì, conosco la comprensione delle liste. non li ho davvero usati però zip() sembra un'altra bella soluzione, grazie! – int3