List comprehension

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
Pylen
User
Beiträge: 1
Registriert: Mittwoch 11. Dezember 2019, 15:33

Hey ich habe n bisschen versucht, List comprehension zu verstehen und bin auf etwas gestoßen, das ich nicht verstehe.

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = int(input("Please enter a number: "))
print([a for i in a if i < b])

Das Programm gibt bei mir diese Liste aus [1, 1, 2, 3, 8, 34]. Ich verstehe nicht, warum die 34 bei meiner Eingabe von 9 darin ist und zum Beispiel die 13 und die 21 nicht. Kann mir das bitte jemand erklären?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Code ist so doch falsch. Du iterierst ueber die Liste a, und weist deren Elemente dem Namen i zu. Dann pruefst du eine Bedingung mit i und b, aber wenn das wahr ist packst du DIE GANZE LISTE a als Ergebnis in deine List-Comprehension. Das sieht dann komplett anders aus als von dir beschrieben. Insofern passt das vorne und hinten nicht zusammen, und ich denke mal daher kommt auch irgendein anderes beobachtetes Fehlverhalten.

So sieht die Ausgabe aus von deinem Programm oben:

Code: Alles auswählen

[[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89], [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]]
So wenn man es wie eigentlich gedacht korrigiert:

Code: Alles auswählen

Please enter a number: 9
[1, 1, 2, 3, 5, 8]
Also auch nicht mit 34 oder so drin.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Es wird nicht die ganze Liste genommen sondern das i-te Element. [ i ] verschwindet halt weil das der BBCode für kursiv ist. Mit Code-Tags wäre das nicht passiert:

Code: Alles auswählen

a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
b = int(input("Please enter a number: "))
print([a[i] for i in a if i < b])
Dann stimmt auch das beschriebene Verhalten:

Code: Alles auswählen

In [9]: a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] 
   ...: b = int(input("Please enter a number: ")) 
   ...: print([a[i] for i in a if i < b])                                       
Please enter a number: 9
[1, 1, 2, 3, 8, 34]
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ahhh. Interessant. Aber die Problematik ist dann natuerlich trotzdem, dass nicht i, sondern was anderes genommen wird.
Antworten