List comprehension, filter und lambda

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
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

In Stackexchange stieß ich auf Code der sich mir aktuell zu so früher Stunde nicht so recht erschließen will.

Code: Alles auswählen

>>> predicates = lambda x:x<20, lambda x:x>20
>>> print [filter(pred, [25, 8, 22, 9]) for pred in predicates]
[[8, 9], [25, 22]]
Was passiert da? Oder alternativ gefragt: wie könnte ich das mit explizit definierten - also nicht anonymen - Funktionen umsetzen?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Bist du auf der Suche nach

Code: Alles auswählen

In [1]: def less_than_20(x):
   ...:     return x < 20
   ...: def greater_than_20(x):
   ...:     return x > 20
   ...: 

In [2]: print [filter(pred, [25, 8, 22, 9]) for pred in [less_than_20, greater_than_20]]
[[8, 9], [25, 22]]
?

Hier passiert nicht mehr als

Code: Alles auswählen

In [3]: predicates = [less_than_20, greater_than_20]

In [4]: res = []

In [5]: for p in predicates:
   ...:     valids = []
   ...:     for x in [25, 8, 22, 9]:
   ...:         if p(x):
   ...:             valids.append(x)
   ...:     res.append(valids)
   ...:     

In [6]: res
Out[7]: [[8, 9], [25, 22]]
Oder versteh ich dich hier falsch?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

cofi hat geschrieben:Oder versteh ich dich hier falsch?
Nein tust du nicht. Jetzt sehe ich es auch. Ich hatte die ganze Zeit geistig ein im Code nicht vorhandenes if im Kopf. Es ist gestern (bzw. heute morgen) zu spät geworden ...

Danke.
Antworten