Seite 1 von 1

List comprehension

Verfasst: Mittwoch 11. Dezember 2019, 15:37
von Pylen
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?

Re: List comprehension

Verfasst: Mittwoch 11. Dezember 2019, 15:53
von __deets__
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.

Re: List comprehension

Verfasst: Mittwoch 11. Dezember 2019, 17:13
von __blackjack__
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]

Re: List comprehension

Verfasst: Mittwoch 11. Dezember 2019, 17:38
von __deets__
Ahhh. Interessant. Aber die Problematik ist dann natuerlich trotzdem, dass nicht i, sondern was anderes genommen wird.