2009-08-15 15 views
8

Byłem mucking nieco z Python i I zostały zebrane, że jest zwykle lepsze (lub „pythonic”) do wykorzystaniaDostęp do elementów z przesunięcia w Pythonie dla .. w pętli

for x in SomeArray: 

raczej więcej niż w stylu C

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

widzę korzyści, w tym, przede wszystkim czystsze kod i możliwość korzystania ładne map() i podobnych funkcji. Jednak często mam do czynienia z sytuacją, w której chciałbym jednocześnie uzyskać dostęp do elementów o różnych przesunięciach w macierzy. Na przykład, chciałbym dodać bieżący element do elementu dwa kroki za nim. Czy istnieje sposób, aby to zrobić bez uciekania się do wyraźnych indeksów?

+1

Należy zauważyć, że zakres (0, len (SomeArray)) jest równoważny z bardziej typowym zakresem (len (SomeArray)). – EOL

Odpowiedz

14

Sposobem tym celu w Pythonie:

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

Generator enumerate wytwarza sekwencję krotki-2, każda zawierająca indeksu tablicy i element.

+0

Ale jak uzyskać dostęp do poprzednich/kolejnych elementów w jednej iteracji pętli? – int3

+0

Wewnątrz pętli można uzyskać dostęp do opcji SomeArray [i-1] lub SomeArray [i + 1]. –

+0

'SomeArray [i-1]'? Ale możesz wyjaśnić, co właściwie robisz – SilentGhost

6

Indeksowanie listy i zip() to Twoi znajomi.

Oto moja odpowiedź dla bardziej konkretne pytanie:

może chcę dodać bieżący element do elementu dwa kroki za nim. Czy istnieje sposób, aby to zrobić bez uciekania się do wyraźnych indeksów?

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

Można również użyć modułu numpy jeśli zamierzają pracować na tablicach liczbowych. Na przykład, powyższy kod może być bardziej elegancki zapisać jako:

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

Dodanie n-ty element do (n-2) tego elementu odpowiada dodanie elementu mc z (M + 2) elementu (na matematycznie, przeprowadziliśmy podstawienie n-> m + 2). Zakres n wynosi [2, len (arr)), a zakres m wynosi [0, len (arr) -2). Zwróć uwagę na nawiasy i nawiasy. Elementy od 0 do len (arr) -3 (wykluczasz dwa ostatnie elementy) są indeksowane jako [: -2], podczas gdy elementy od 2 do len (arr) -1 (wykluczasz pierwsze dwa elementy) są indeksowane jako [ 2:].

Zakładam, że znasz już spisane wyrażenia.

+0

Tak, wiem, że rozumiem listę. tak naprawdę ich nie używałem. zip() wygląda jak inne fajne rozwiązanie, dzięki! – int3

Powiązane problemy