Python: Elemente einer Liste in Int umwandeln?
Ich habe folgende Übungsaufgabe. Die gegebene Lösung ist mit meiner Lösung identisch aber Python spuckt eine Fehlermeldung aus.
my_list = list[range(11)]
my_set = set()
for x in my_list:
if x%2==0:
my_set.add(x**2)
print(my_set)
TypeError: unsupported operand type(s) for %: 'types.GenericAlias' and 'int'
Python weist auf die Zeile "if x%2==0:" hin.
Das interpretiere ich so als muss ich die Elemente von my_list in int() setzen. Wie mache ich das? Ich habe schon das ein oder andere ausprobiert wie das simpelste x = int(x) und Google gefragt aber nichts hat funktioniert.
2 Antworten
my_list = list[range(11)]
Du würdest hiermit auf das Element range(11) in der Liste list zugreifen - wobei list eben die Klasse für Listen ist.
my_list = list(range(11))
Erstelle eine Instanz der Klasse list unter Verwendung der Elemente, die de Generator erzeugt.
Noch als Randnotiz:
range() kann steppen, also Sprünge machen, mit filter() kannst du ein iterable mti eienr Filterfunktion filtern, in einerm Generatorausdruck oder einer Comprehension kannst Du auch direkt filtern durch Nebenbedingung.
Es gäbe also mehrere Varianten ein Set mit geraden Zahlen zu erzeugen.
Also, Python kennt Listen, diese werden von der Klasse list implementiert. Soweit so einfach.
Für den Zugriff auf Elemente in entsprechendne Datenstrukturen wird [] genutzt, schauen wir uns das mal an:
>>> l=[0,1,2,3,4,5,6,7,8,9]
>>> l
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> type(l)
<class 'list'>
>>> l[3]
3
>>> l[1:-1]
[1, 2, 3, 4, 5, 6, 7, 8]
>>> l[1:-1:2]
[1, 3, 5, 7]
Die Nutzung von ; innerhalb der [] nennt man slicing, eckige Klammern hinter einem Namne) greifen auf Teile (hier der Liste) des Datentyps zu.
Ferner nutzt Python eckige Klammern für die Definition einer Liste, die rechte Seite der ersten Zeile definiert eine Liste.
Wenn ich ein Objekt der Klasse list instanziieren will, dann schreibe ich dafür list(), wobei ich so eine leere liste erzeuge, während ich aber auch ein iterierbares Objekt übergeben darf, dessen Objekte dann zu Listenelementen werden. (Mehr Infos zu weiteren Möglichkeiten unten)
Schauen wir uns das doch mal an:
>>> list() #leere Liste
[]
>>> list('Hallo') #aus iterable instanziieren
['H', 'a', 'l', 'l', 'o']
Ein String ist iterierbar, seine Teilobjekte sind Buchstaben, instanziiere ich also eine Liste, werden die Buchstaben des Strings zu Listenelementen.
range(num) wiederum erzeugt eine Klasse, die nacheinander die einzelnen Werte entsprechend der Parameter erzeugt. range() ist auch iterierbar.
>>> list(range(11))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> list(range(2,12))
[2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
>>> list(range(2,12,5))
[2, 7]
Am besten schaust Du mal in die Dokumentation:
https://docs.python.org/3/library/stdtypes.html#typesseq-range
Hier wird die Range ausführlicher beschrieben, hier noch die Infos zur Liste:
my_list = list[range(11)]
Der Fehler kommt daher, dass in der Liste keine einzelnen Zahlen stehen, sondern nur ein Range-Objekt. Die Zeile bewirkt also nicht das was Du beabsichtigt hast.
Probiers mal mit
my_list = [i for i in range(11)]
Das funktioniert, danke. Dumme Frage zum Verständnis: Wenn ich nur die beiden my_list = () -Zeilen mit print ausgebe, erhalte ich jeweils eine Liste der Zahlen 0-10. Also tut die Zeile doch genau was ich wollte? Außerdem müsste es doch einen Syntax-Error melden, würden in der ersten Liste keine Zahlen stehen, oder nicht?
Die Erklärungen verstehe ich nicht. Kannst du das einfach und verständlich wiederholen? Aber ich sehe, dass ich die Klammern verwechselt habe. Mit runden Klammern funktioniert es.