Seite 1 von 1

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

Verfasst: Mittwoch 7. Juli 2010, 01:29
von gkuhl
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

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

Verfasst: Mittwoch 7. Juli 2010, 01:38
von pillmuncher
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

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

Verfasst: Mittwoch 7. Juli 2010, 03:12
von 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])

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

Verfasst: Freitag 9. Juli 2010, 13:59
von gkuhl
Vielen Dank für die beiden Ideen!

Grüße
Gerrit

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

Verfasst: Freitag 9. Juli 2010, 14:05
von hendrikS
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