Pythonischere Möglichkeiten für "xrange(len(A)-1)"

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Hallo,

ich stolpere häufig über das Problem, dass ich mit zwei oder mehr benachbarten Werten in einem Feld (numpy.array, lists...) rechnen möchte. Ein einfaches Beispiel wäre:

Code: Alles auswählen

In [5]: feld = range(10)

In [6]: for i in xrange(len(feld)-1):
   ...:     print feld[i] * feld[i+1]
   ...:     
   ...:     
0
2
6
12
...
Ich würde jetzt gerne auf das unschöne "xrange(len(feld)-1)" verzichten und stattdessen pythonischeren Code produzieren. Gibt es dafür schon irgendwelche Möglichkeiten in Python? Ich wäre über ein paar Ideen dankbar.

Grüße
Gerrit
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

In der itertools-Doku gibt es ein Rezept dazu:

Code: Alles auswählen

from itertools import izip, tee

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

for a, b in pairwise(xrange(5)):
    print a + b
In specifications, Murphy's Law supersedes Ohm's.
BlackJack

@gkuhl: Und bei `numpy.array` bietet sich "slicing" an:

Code: Alles auswählen

In [54]: feld = np.arange(10)

In [55]: feld[:-1] * feld[1:]
Out[55]: array([ 0,  2,  6, 12, 20, 30, 42, 56, 72])
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

Vielen Dank für die beiden Ideen!

Grüße
Gerrit
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Hier ist noch eine dritte, die ich in dem Fall immer verwende. Eigentlich sehr simpel.

Code: Alles auswählen

a = [1,2,3,4,5]
for i,j in zip(a,a[1:]):
    print i*j
Antworten