Seite 1 von 1
Funktion für eine Liste
Verfasst: Mittwoch 9. Juli 2008, 09:57
von quvalue
Hallo,
ich habe eine Funktion, als Beispiel
, und möchte diese für eine Liste verwenden. Bisher habe ich das uneleganterweise so gelöst:
Code: Alles auswählen
def liste_bla(listex):
result = []
for el in listex: result.append(bla(el))
return result
Es gibt sicher einen viel besseren Weg, aber ich komme nicht darauf. bla könnte auch eine komplexere Funktion sein.
Ich habe folgende schöne Funktion gefunden, die eine Liste von Listen transponiert. So ganz habe ich das Vorgehen nicht verstanden. Kann man das Prinzip auf jede Funktion erweitern?
Code: Alles auswählen
def transposed(lists):
if not lists: return []
return map(lambda *row: list(row), *lists)
Verfasst: Mittwoch 9. Juli 2008, 10:01
von lutz.horn
Verwendet
List comprehension
Code: Alles auswählen
def bla(x):
return 2 * x
l = [1, 2, 3, 4]
print [bla(x) for x in l]
# => [2, 4, 6, 8]
Oder noch kürzer:
Code: Alles auswählen
l = [1, 2, 3, 4]
print [x * 2 for x in l]
# => [2, 4, 6, 8]
Verfasst: Mittwoch 9. Juli 2008, 10:06
von quvalue
Danke!
Verfasst: Mittwoch 9. Juli 2008, 10:10
von EyDu
map war schon richtig!
Diese beiden Lösungen entsprechen den Ergebnissen der Funktion "liste_bla" aus deinem ersten Post:
Für die Erklärung von lambda schaust du am besten mal in der Doku nach.
Edit:
Code: Alles auswählen
import operator
import functools
map(functools.partial(operator.mul, 2), listex)

Verfasst: Mittwoch 9. Juli 2008, 10:16
von lutz.horn
GvR war mal der Meinung, dass lambda, filter, map und reduce für Python 3000 entfernt werden sollen. Inzwischen soll dieses Schicksal wohl nur noch reduce ereilen.
List Comprehension und Generatoren sind jedenfalls zu bevorzugen.
Verfasst: Mittwoch 9. Juli 2008, 10:17
von quvalue
Was ist mit Verkettung?
Code: Alles auswählen
>>> b = lambda x:2*x
>>> d = lambda x:1.4*x
>>> map(d,map(b,[1,2]))
[2.7999999999999998, 5.5999999999999996]
Folgendes geht nicht
Verfasst: Mittwoch 9. Juli 2008, 10:18
von lutz.horn
Was soll damit sein? Verkettung funktioniert mit alle vorgestellen Varianten.
Verfasst: Mittwoch 9. Juli 2008, 10:24
von EyDu
Warum sollte "map([b,d],[1,2])" denn funktionieren? Der Interpreter kann schlecht raten, was damit gemeint sein soll. Die Dokumentation sagt dir in solchen Fällen ganz genau was möglich ist und was nicht.
Edit: Suchst du so etwas?
Code: Alles auswählen
>>> def composition(*args):
def _composition(x):
for arg in args[::-1]:
x = arg(x)
return x
return _composition
>>> x = composition(lambda x: x+10, lambda x: x*2)
>>> x(4)
18
>>>
Verfasst: Mittwoch 9. Juli 2008, 10:31
von rayo
lutz.horn hat geschrieben:GvR war mal der Meinung, dass lambda, filter, map und reduce für Python 3000 entfernt werden sollen. Inzwischen soll dieses Schicksal wohl nur noch reduce ereilen.
List Comprehension und Generatoren sind jedenfalls zu bevorzugen.
Nicht entfernt sondern nur verschoben, weg aus dem builtin hin zu functools. Ausser bei lambda (ist keine Funktion wie filter,...), aber das bleibt ja.
Verfasst: Mittwoch 9. Juli 2008, 10:39
von quvalue
EyDu hat geschrieben:
Edit: Suchst du so etwas?
Genau. Ich habe gerade auch
oakwinter entdeckt.