dwb1251 Geschrieben 18. Januar Geschrieben 18. Januar Hallo, ich mache gerade meine ersten mehr oder weniger ernsten Gehversuche im Programmieren. Ich habe einen Code geschrieben und verstehe nicht ganz, warum er macht, was er macht.. Das ist mein Programm bookshelf = ["Harry Potter 1","Harry Potter 2", "Harry Potter 3","Harry Potter 4", \ "Harry Potter 5" , "Harry Potter 6", "Harry Potter 7"] bookshelf2 = bookshelf.copy() bookshelf2.append(14.23) for i in bookshelf2: if type(bookshelf2) == str: continue else: popped_value = bookshelf2.pop() print(popped_value) Ich erkläre mal kurz, was ich gemacht habe bzw. versucht habe zu machen. Ich habe eine Liste mit Werten des Typs String erstellt. Dannach habe ich diese Liste kopiert mit dem Ziel, dass ich eine zweite Liste habe, die den gleichen Inhalt hat wie die erste, mit dem Unterschied, dass ich die zweite verändern kann ohne dass sich die erste ändert. Dann habe ich der zweiten Liste einen Wert des Types Float mit Hilfe einer Listen-Funktion/Methode hinzugefügt. Im nächsten Schritt habe ich dann eine Zählschleife erstellt/definiert (wie auch immer), die so lange läuft, bis jeder Wert der Liste "erreichht wurde." Bei jedem Schleifendurchgang soll überprüft werden, ob es sich bei dem Listeninhalt um den Typ String handelt. Falls das der Fall ist, soll das Programm fortgesetzt werden und zwar so lange bis in der Liste ein Wert auftaucht, der nicht den Typ String hat und falls dem so ist, soll der Wert in die Variable popped_value geschrieben werden. Am Ende soll popped_value in der Konsole als Text ausgegeben werden. In meinem Programm gibt es nur einen Wert der nicht vom Typ String ist. Das ist der Wert 14.23, der offensichtlich Float ist. Dieser Wert müsste dann auch ausgegeben werden. So weit so gut. Was bekomme ich als Ausgbe in die Konsole geschrieben? Harry Potter 5 Process finished with exit code 0 Ich habe überhaupt keine Idee, warum es ausgerechnet Harry Potter 5 ist. Ist das eine Litteratur-Empfehlung oder habe ich etwas grundsätzlich nicht verstanden? Ich bedanke mich schon einmal für die Antworten und hoffe, dass mein Beitrag mehr oder weniger den Richtlinien dieses Forums entspricht. Zitieren
maarrco Geschrieben 18. Januar Geschrieben 18. Januar Gude, ich hab zwar gar keine Ahnung von Python, aber hier mal die Antwort von ChatGPT: Um den Code zu korrigieren und das gewünschte Verhalten zu erreichen, solltest du den Datentyp jedes Elements in der Schleife überprüfen. Hier ist eine überarbeitete Version des Codes: bookshelf = ["Harry Potter 1", "Harry Potter 2", "Harry Potter 3", "Harry Potter 4", "Harry Potter 5", "Harry Potter 6", "Harry Potter 7"] bookshelf2 = bookshelf.copy() bookshelf2.append(14.23) for i in bookshelf2: if type(i) == str: continue else: popped_value = bookshelf2.pop() print(popped_value) Jetzt wird der Datentyp jedes Elements überprüft, und nur wenn es sich um einen String handelt, wird die Schleife fortgesetzt. Dadurch wird "Harry Potter 7" nicht aus der Liste entfernt, und du erhältst den gewünschten Ausgang. Warum dein Programm Harry Potter 5 ausgibt anstatt Harry Potter 7 wies hier steht, weiß ich auch net. Kannst ja selbst nochmal nachschauen. Zitieren
dwb1251 Geschrieben 18. Januar Autor Geschrieben 18. Januar Ich Danke dir und ChatGPT. Jetzt funktioniert es. maarrco reagierte darauf 1 Zitieren
_n4p_ Geschrieben 18. Januar Geschrieben 18. Januar vor 7 Stunden schrieb dwb1251: Jetzt funktioniert es. Zufällig ja. bookshelf2.pop() - entfernt das letzte Element aus der Liste, und zufällig ist das in dem Fall richtig. Nicht richtig hingegen ist es Elemente aus einer Liste zu entfernen die gerade durchlaufen werden soll. Angenommen der vorliegende Code wird mit einer Liste ausgeführt, die an dritter, vierter und letzter Stelle keinen String enthält. Wird das dritte Element erreicht, wird das letzte Element entfernt. Beim erreichen der vierten Stelle wird dann das vorletzte Element aus der Ursprünglichen Liste entfernt (was dann wieder kein String ist). Das "letzte" Element wird dann nie geprüft, da es nicht mehr erreicht werden kann. Selbst wenn man .pop(x) den korrekten Index des zu entfernenden Elementes geben würde, wäre es noch falsch. Dann wird zwar zunächst das dritte Element entfernt, allerdings wird das vierte nie geprüft, da es jetzt das dritte Element ist und damit übersprungen wird. vor 7 Stunden schrieb dwb1251: Am Ende soll popped_value in der Konsole als Text ausgegeben werden. Das macht bei der Beispiel-Liste zwar noch irgendwie Sinn, aber was soll passieren wenn mehrere Elemente entfernt werden müssten? Letztlich würde man hier eine neue Liste erzeugen die entweder alle Strings oder alle Nicht-Strings enthält. [x for x in bookshelf2 if type(x) == str] ['Harry Potter 1', 'Harry Potter 2', 'Harry Potter 3', 'Harry Potter 4', 'Harry Potter 5', 'Harry Potter 6', 'Harry Potter 7'] [x for x in bookshelf2 if type(x) is not str] [14.23] Zitieren
MiaMuh Geschrieben 18. Januar Geschrieben 18. Januar vor 10 Stunden schrieb dwb1251: bookshelf = ["Harry Potter 1","Harry Potter 2", "Harry Potter 3","Harry Potter 4", \ "Harry Potter 5" , "Harry Potter 6", "Harry Potter 7"] bookshelf2 = bookshelf.copy() bookshelf2.append(14.23) for i in bookshelf2: if type(bookshelf2) == str: continue else: popped_value = bookshelf2.pop() print(popped_value) Ich weiß nicht, ob das ein Einfügefehler ist oder ob das im Code beabsichtigt ist. Aber da ist nach "Harry Potter 4" ein Schrägstrich Zitieren
dalli Geschrieben 18. Januar Geschrieben 18. Januar (bearbeitet) der Fehler liegt im for block.... Der Fehler lag in if statement. Du hast immer geprüft ob bookshelf2 ein String ist, ist es aber nicht, es ist eine Liste...du wolltest aber prüfen ob der Wert in der Liste ein String ist. Dieser wird in der for Schleife in der Variable book abgelgt. in i wird noch die position des Titels in der Liste angegeben. Diese brauchen wir später für den pop befehl, da er sonst nur den letzen eintrag (default) entfernt. for i,book in enumerate(bookshelf2): if type(book) == str: continue else: popped_value = bookshelf2.pop(i) ansonsten ist der code an sich richtig, ich würde jedoch den type anders prüfen: if isinstance(book, str): Das ist die Empfehlung im Python, da es bei der Prüfung auch subklassen berücksichtigt. In diesen Fall funktioniert das aber auch so wunderbar. For der letzen Print Anweisung solltest du aber noch prüfen ob poped_value überhaupt einen Wert besitzt, ansonsten gibt es ein NameError beim Print, wenn du nur Strings in der Liste hattest. if 'popped_value' in locals(): print(popped_value) else: print('Es wurd kein Wert gepoppt') Edit: hatte selber noch ein Fehler in meinem Code geändert Bearbeitet 18. Januar von dalli Zitieren
_n4p_ Geschrieben 18. Januar Geschrieben 18. Januar vor 14 Minuten schrieb dalli: ansonsten ist der code an sich richtig immer noch nicht, .pop() ohne argument entfernt das letzte Element aus der Liste und gibt es zurück. Da das gesuchte Element an die Liste angehängt wurde funktioniert das zufällig. So wie mehr als ein Nicht-String in der Liste ist wird das Ergebnis falsch sein. Im Grunde könnte man die komplette Schleife weglassen und nur mit popped_value = bookshelf2.pop() das gleiche Ergebnis erhalten, das zufällig richtig ist. Zitieren
_n4p_ Geschrieben 18. Januar Geschrieben 18. Januar vor einer Stunde schrieb dalli: Edit: hatte selber noch ein Fehler in meinem Code geändert irgendwas fehlt da bei der zweiten Liste, oder? Zitieren
carnaqe Geschrieben 18. Januar Geschrieben 18. Januar vor 15 Stunden schrieb dwb1251: Hallo, ich mache gerade meine ersten mehr oder weniger ernsten Gehversuche im Programmieren. Ich habe einen Code geschrieben und verstehe nicht ganz, warum er macht, was er macht.. Das ist mein Programm bookshelf = ["Harry Potter 1","Harry Potter 2", "Harry Potter 3","Harry Potter 4", \ "Harry Potter 5" , "Harry Potter 6", "Harry Potter 7"] bookshelf2 = bookshelf.copy() bookshelf2.append(14.23) for i in bookshelf2: if type(bookshelf2) == str: continue else: popped_value = bookshelf2.pop() print(popped_value) Ich erkläre mal kurz, was ich gemacht habe bzw. versucht habe zu machen. Ich habe eine Liste mit Werten des Typs String erstellt. Dannach habe ich diese Liste kopiert mit dem Ziel, dass ich eine zweite Liste habe, die den gleichen Inhalt hat wie die erste, mit dem Unterschied, dass ich die zweite verändern kann ohne dass sich die erste ändert. Dann habe ich der zweiten Liste einen Wert des Types Float mit Hilfe einer Listen-Funktion/Methode hinzugefügt. Im nächsten Schritt habe ich dann eine Zählschleife erstellt/definiert (wie auch immer), die so lange läuft, bis jeder Wert der Liste "erreichht wurde." Bei jedem Schleifendurchgang soll überprüft werden, ob es sich bei dem Listeninhalt um den Typ String handelt. Falls das der Fall ist, soll das Programm fortgesetzt werden und zwar so lange bis in der Liste ein Wert auftaucht, der nicht den Typ String hat und falls dem so ist, soll der Wert in die Variable popped_value geschrieben werden. Am Ende soll popped_value in der Konsole als Text ausgegeben werden. In meinem Programm gibt es nur einen Wert der nicht vom Typ String ist. Das ist der Wert 14.23, der offensichtlich Float ist. Dieser Wert müsste dann auch ausgegeben werden. So weit so gut. Was bekomme ich als Ausgbe in die Konsole geschrieben? Harry Potter 5 Process finished with exit code 0 Ich habe überhaupt keine Idee, warum es ausgerechnet Harry Potter 5 ist. Ist das eine Litteratur-Empfehlung oder habe ich etwas grundsätzlich nicht verstanden? Ich bedanke mich schon einmal für die Antworten und hoffe, dass mein Beitrag mehr oder weniger den Richtlinien dieses Forums entspricht. Du hast in einer schleife arr mit str verglichen, und in jedem durchgang .pop gemacht bis die Liste nur noch ein Element enthalten hat. Letztes Element in popped_value war dann "Harry Potter 5". Wahrscheinlich ein unerwartetes verhalten in python durch die verwendung von .pop in einem python for loop Zitieren
hellerKopf Geschrieben 18. Januar Geschrieben 18. Januar vor 47 Minuten schrieb carnaqe: Du hast in einer schleife arr mit str verglichen Aber ist bookshelf nicht eine Liste, da sie verschiedene Datentypen aufnimmt ? "The main difference between lists and arrays is that arrays constrain the object type it can store. Lists do not give you a way to limit the types of objects they contain. When using an array, you can be sure that it only contains the type that was specified upon creation. A single Python list can simultaneously store integers, strings, and dictionaries. You can even add more elements of still other types to an existing list. By contrast, elements in a Python array can only be of one type. An array of integers can only contain integers and can only have other integers added to it." Zitieren
carnaqe Geschrieben 18. Januar Geschrieben 18. Januar vor 2 Stunden schrieb hellerKopf: Aber ist bookshelf nicht eine Liste, da sie verschiedene Datentypen aufnimmt ? "The main difference between lists and arrays is that arrays constrain the object type it can store. Lists do not give you a way to limit the types of objects they contain. When using an array, you can be sure that it only contains the type that was specified upon creation. A single Python list can simultaneously store integers, strings, and dictionaries. You can even add more elements of still other types to an existing list. By contrast, elements in a Python array can only be of one type. An array of integers can only contain integers and can only have other integers added to it." ja, so oder so hat er hat halt ein objekt mit einem primitiven Typ verglichen das funzt so oder so nicht. kenn mich mit python Implementierung nicht aus Zitieren
dalli Geschrieben 20. Januar Geschrieben 20. Januar Richtig was carnaqe schreibt. Eine Liste ist eine Anreihungen von Variablen. Du kannst die mit verschiedenen Datentypen befüllen. Hier ein Beispiel # liste = [str,int,float,list,dict] liste = ["word",22,1.2,["hallo",1],{"Name":"Peter"}] wenn du die nun die Datentypen abfragen würdest: print('Ganze Liste:') print(f'{liste:} = {type(liste)}') print() print('Inhalt der Liste:') for entry in liste: print(f'{entry:} = {type(entry)}') Ausgabe: Ganze Liste: ['word', 22, 1.2, ['hallo', 1], {'Name': 'Peter'}] = <class 'list'> Inhalt der Liste: word = <class 'str'> 22 = <class 'int'> 1.2 = <class 'float'> ['hallo', 1] = <class 'list'> {'Name': 'Peter'} = <class 'dict'> Parser reagierte darauf 1 Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.