Doppelte Iteratoren

06/08/2009 - 15:00 von Ole Streicher | Report spam
Hallo Gruppe,

gleich noch so eine "geht, sieht aber komisch aus"-Frage hinterher: Ich
habe relativ hàufig zwei Listen (oder Numpy-Arrays) miteinander zu
verknüpfen. Typischerweise mache ich das so:

coeff = [0.5, 0.7, 0.9]
myfunc = [ f1, f2, f3 ] # woanders definierte Funktionen

def func(x):
r = 0
for i in xrange(coeff.__len__()):
r += coeff[i] * myfunc[i](x)
return r

Was mir daran nicht gefàllt ist, dass ich einen eigentlich unnötigen
Index "i" verwende und pro Durchlauf zwei zusàtzliche Lookups coeff[i]
und myfunc[i] drinhabe (die alle Zeit kosten...).
Außerdem verlasse ich mich darauf, dass "coeff" eine __len__()-Methode
hat, was nicht immer (numpy) erfüllt ist.

Wie kann man das eleganter lösen? Ich dachte da an sowas wie

for c, f in coeff, myfunc:
r += c * f(x)

was aber natürlich nicht funktioniert.

Viele Grüße

Ole
 

Lesen sie die antworten

#1 Peter Otten
06/08/2009 - 15:13 | Warnen spam
Ole Streicher wrote:

gleich noch so eine "geht, sieht aber komisch aus"-Frage hinterher: Ich
habe relativ hàufig zwei Listen (oder Numpy-Arrays) miteinander zu
verknüpfen. Typischerweise mache ich das so:

coeff = [0.5, 0.7, 0.9]
myfunc = [ f1, f2, f3 ] # woanders definierte Funktionen

def func(x):
r = 0
for i in xrange(coeff.__len__()):
r += coeff[i] * myfunc[i](x)
return r

Was mir daran nicht gefàllt ist, dass ich einen eigentlich unnötigen
Index "i" verwende und pro Durchlauf zwei zusàtzliche Lookups coeff[i]
und myfunc[i] drinhabe (die alle Zeit kosten...).
Außerdem verlasse ich mich darauf, dass "coeff" eine __len__()-Methode
hat, was nicht immer (numpy) erfüllt ist.

Wie kann man das eleganter lösen? Ich dachte da an sowas wie



for c, f in zip(coeff, myfunc):
r += c * f(x)

was aber natürlich nicht funktioniert.



Bei langen Listen oder Iteratoren lohnt sich die "lazy" Variante
itertools.izip().

Peter

Ähnliche fragen