if in 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
mechanicalStore
User
Beiträge: 172
Registriert: Dienstag 29. Dezember 2009, 00:09

Folgendes funktioniert:

Code: Alles auswählen

from pathlib import Path
...
file_names = [x for x in Path(where_ever_the_path_is).iterdir() if x.is_file()]
Warum nicht auch so:

Code: Alles auswählen

file_names = [(lambda x: if x.is_file()) for x in Path(where_ever_the_path_is).iterdir()]
Ausgabe:
.

Code: Alles auswählen

..
    file_names = [(lambda x: if x.is_file()) for x in Path(where_ever_the_path_is).iterdir()]
                        ^^
SyntaxError: invalid syntax
Benutzeravatar
Dennis89
User
Beiträge: 1517
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

die Funktion muss irgendwas zurück geben, das fehlt bei dir.

Code: Alles auswählen

file_names = [lambda x: x if x.is_file() else None for x in Path(where_ever_the_path_is).iterdir()]
Aber jetzt hast du auch `None` in deiner Liste. Ich sehe keinen Vorteil hier `lambda` zu verwenden.


Grüße
Dennis

Edit: Halt mal, du hast nun eine Liste von lambda-Funktionen. Muss das eben auch selbst noch testen, da habe ich zu schnell darauf los getippt.

Edit2:
Die Funktion muss natürlich aufgerufen werden:

Code: Alles auswählen

file_names = [(lambda x:x if x.is_file() else None)(x) for x in Path(Path.home()).iterdir()]

Oder funktional:

Code: Alles auswählen

file_names = list(map(lambda x: x if x.is_file() else None, Path(Path.home()).iterdir()))
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
sparrow
User
Beiträge: 4525
Registriert: Freitag 17. April 2009, 10:28

@mechanicalStore: Der funktionierende Code ist, wie List Comprehensions funktionieren.
Das lässt sich auch ganz gut in natürliche Sprache bringen: Erstelle mir eine neue Liste mit den jeweiligen Elementen 'x' für alle 'x' in Path(where_ever_the_path_is).iterdir() aber packe nur in die Liste, wenn für x x.is_path() wahr ist.

Und dein zweiter Versuch ist kein gültiges Python.
Vielleicht schaust du noch mal, was lambda eigentlich ist. Das sind anonyme Funktionen.
Ich finde die Erklärung bei RealPython eigentlich ganz hilfreich.
Sirius3
User
Beiträge: 18250
Registriert: Sonntag 21. Oktober 2012, 17:20

lambda erzeugt eine anonym Funktion genau aus einem Ausdruck besteht. If kann nicht zu einem Wert ausgewertet werden, ist also kein Ausdruck.
Das ist in deiner List comprehension ist ein Filter. Dadurch enthält die Liste letztlich wenig Elemente. Die Syntax ist nun mal [Ausdruck for x in iterable if filter]
Was wäre der Vorteil, eine Alternative Syntax einzuführen?
Benutzeravatar
__blackjack__
User
Beiträge: 13998
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wenn man da etwas mit einer anonymen Funktion machen wollen würde, böte sich `filter()` an:

Code: Alles auswählen

file_paths = list(filter(lambda path: path.is_file(), Path("...").iterdir()))
Oder wenn man es noch was aus `operator` verwenden möchte:

Code: Alles auswählen

    from operator import methodcaller
    file_paths = list(filter(methodcaller("is_file"), Path("...").iterdir()))
Nur der Vollständigkeit halber. 😜
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
mechanicalStore
User
Beiträge: 172
Registriert: Dienstag 29. Dezember 2009, 00:09

Hallo Zusammen,
danke für die Antworten. Ich sehe ein, dass das ein übertriebener Ansatz war. :D Dennoch gefällt mir __blackjack__'s Ansatz

Code: Alles auswählen

file_paths = list(filter(lambda path: path.is_file(), Path("...").iterdir()))
ganz gut.
Antworten