Frage zu simplem Skript Tubles und Lambda Funktion

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
BertholdPython
User
Beiträge: 2
Registriert: Sonntag 3. Oktober 2021, 14:46

Ich hoffe, dass hier ist das richtige Unterforum für meine Frage.

Ich habe einen sehr simplen code, kann den aber nicht erklären:

Code: Alles auswählen

my_tuple = (0,1,2,3,4,5,6)
foo = list(filter(lambda x: x-1, my_tuple))

print(foo)

Ich weiß, was dieser Code macht und was der Output ist. Also das 0 und 1 rausfallen. Meine Frage ist jetzt, wieso? Was macht diese x-1? Schneidet das einfach die 0 raus? Ich dachte, tuples können nicht verändert werden? Ich hätte auch erst gedacht, es subtrahiert einfach 1, also dann output -1,0,1,2,3,4,5.
Benutzeravatar
sparrow
User
Beiträge: 4535
Registriert: Freitag 17. April 2009, 10:28

Da fallen 0 und 1 raus? Das sehe ich aber nicht so.
Und wo wird denn da ein Tuple verändert? Von welchem Typ ist denn foo?

Nimm die zweite Zeile doch mal auseinaner. Zum Beispiel im interaktiven Interpreter. Was machen die einzelnen Funktionen, die aufgerufen werden?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Programmieren sollte eigentlich Probleme lösen und nicht als Rätsel geschrieben sein.
Das Präfix my_ ist eigentlich nie sinnvoll. Und `tuple` beschreibt nur den Typ aber nicht den Inhalt.

Code: Alles auswählen

numbers = [0,1,2,3,4,5,6]
filtered_numbers = [k for k in numbers if k != 1]
print(filtered_numbers)
Buchfink
User
Beiträge: 193
Registriert: Samstag 11. September 2021, 10:16

@BertholdPython
https://www.guru99.com/python-lambda-function.html#3

Bei mir fällt nur die 1 raus.
Also ich vermute folgendes:
der Filter wird über das Tupel gelegt.
0 - 1 --> -1 / True? (Filter "erfüllt")
1 - 1 --> 0 /False (Filter nicht "erfüllt")
2 - 1 --> 1 / True? (Filter "erfüllt")
...

Also so würde ich das jedenfalls lesen. Im Grunde definiert man damit einen Filter, um das Tupel "einzuschränken".

Falls meine Vermutung nicht stimmt, freue ich mich über Feedback.

Aber wenn man es mit anderen Filtern ausprobiert, passt es zum Verhalten.
z.B.

Code: Alles auswählen

numbers = (0,1,2,3,4,5,6)
foo = list(filter(lambda i: i>2, numbers))

print(foo)
filtert alles was größer 2 ist

"list()" konvertiert das Tupel dann wohl in eine Liste.
Wenn man in einem Juypter-Notebook z.B. "list?" eingibt, bekommt man die Doku und die würde ich so lesen.
BertholdPython
User
Beiträge: 2
Registriert: Sonntag 3. Oktober 2021, 14:46

Buchfink hat geschrieben: Sonntag 3. Oktober 2021, 17:45 @BertholdPython
https://www.guru99.com/python-lambda-function.html#3

Bei mir fällt nur die 1 raus.
Also ich vermute folgendes:
der Filter wird über das Tupel gelegt.
0 - 1 --> -1 / True? (Filter "erfüllt")
1 - 1 --> 0 /False (Filter nicht "erfüllt")
2 - 1 --> 1 / True? (Filter "erfüllt")
...

Also so würde ich das jedenfalls lesen. Im Grunde definiert man damit einen Filter, um das Tupel "einzuschränken".

Falls meine Vermutung nicht stimmt, freue ich mich über Feedback.

Aber wenn man es mit anderen Filtern ausprobiert, passt es zum Verhalten.
z.B.

Code: Alles auswählen

numbers = (0,1,2,3,4,5,6)
foo = list(filter(lambda i: i>2, numbers))

print(foo)
filtert alles was größer 2 ist

"list()" konvertiert das Tupel dann wohl in eine Liste.
Wenn man in einem Juypter-Notebook z.B. "list?" eingibt, bekommt man die Doku und die würde ich so lesen.
Das war die entscheidende Hilfe, vielen Dank. Ja, war mein Fehler, ich hatte es zur Vereinfachung auf 0 reduziert, im Original ist es mit x-0 and x-1.

0 - 1 --> -1 / True? (Filter "erfüllt")
1 - 1 --> 0 /False (Filter nicht "erfüllt")
2 - 1 --> 1 / True? (Filter "erfüllt")

Das war der entscheidende Punkt, dass 1-1 eben 0 wird und das ist False. Mir war nicht die Logik dahinter klar, dass man das so abprüfen kann. Ich hätte halt ein einfaches != oder so erwartet. Andere Zahlen ergeben eben nicht 0 und dann eben ein True, kein False. Danke!
Antworten