Seite 1 von 1

if in lambda

Verfasst: Samstag 26. Oktober 2024, 10:38
von mechanicalStore
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

Re: if in lambda

Verfasst: Samstag 26. Oktober 2024, 11:28
von Dennis89
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()))

Re: if in lambda

Verfasst: Samstag 26. Oktober 2024, 11:42
von sparrow
@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.

Re: if in lambda

Verfasst: Samstag 26. Oktober 2024, 11:43
von Sirius3
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?

Re: if in lambda

Verfasst: Samstag 26. Oktober 2024, 11:55
von __blackjack__
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. 😜

Re: if in lambda

Verfasst: Samstag 26. Oktober 2024, 12:25
von mechanicalStore
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.