Seite 1 von 1
Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Donnerstag 30. August 2018, 15:36
von togo
Hallo.
Ich habe Listen die im Datentyp (str - Zeichenkette) erstellt werden. (Leider)
Hier der Aufbau:
Code: Alles auswählen
xListe = ['[[0, 0, 1, 1],[0, 1, 1],[0, 1, 0, 1],[0, 1, 1, 0, 1]]']
Um die Geschachtelten Listen bearbeiten zu können, muss der Datentyp geändert werden in (int).
Die Verschachtelung mit Inhalt sollte natürlich unverändert bleiben, (sieh unten).
Code: Alles auswählen
xListe = [[0, 0, 1, 1],[0, 1, 1],[0, 1, 0, 1],[0, 1, 1, 0, 1]]
Im Forum hab ich einen ähnlichen Fall gefunden, aber dabei ging es um eine Liste die nicht Geschachtelt war.
Klappt bei Geschachtelten Listen nicht.
Code: Alles auswählen
xListe = ['1', '2', '3']
xListe = [int(i) for i in xListe]
print(xListe)
Für Tipps und Vorschläge danke ich im voraus.
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Donnerstag 30. August 2018, 15:52
von __deets__
Das Modul ast und seine Funktion literal_eval sind dein Freund:
Code: Alles auswählen
import ast
xListe = ['[[0, 0, 1, 1],[0, 1, 1],[0, 1, 0, 1],[0, 1, 1, 0, 1]]']
ast.literal_eval(xListe[0])
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Donnerstag 30. August 2018, 16:03
von __blackjack__
Wobei man auch fragen sollte wie diese Liste überhaupt zustande gekommen ist. Falls das JSON ist, sollte man auch das `json`-Modul verwenden. Und falls das eine Python-Liste war die in eine Zeichenkette umgewandelt wurde, sollte man das an *der* Stelle dringend überdenken. Und zum Beispiel das `json`-Modul verwenden.
Code: Alles auswählen
In [4]: json.loads('[[0, 0, 1, 1],[0, 1, 1],[0, 1, 0, 1],[0, 1, 1, 0, 1]]')
Out[4]: [[0, 0, 1, 1], [0, 1, 1], [0, 1, 0, 1], [0, 1, 1, 0, 1]]
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Donnerstag 30. August 2018, 19:09
von togo
__deets__
Besten Dank für das Modul ast und seine Funktion literal_eval, funktioniert einwandfrei.
__blackjack__
Die Liste kommt zustande, wenn ich unter Blender eine Python-Liste speichere. Und das geht halt nur mit Zeichenkette. Es ist wie es ist.
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Donnerstag 30. August 2018, 20:40
von __deets__
Ich arbeite auch mit Blender, und das ist ganz bestimmt NICHT so. Ich speichere das problemlos Daten zb als JSON etc.
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Freitag 31. August 2018, 08:44
von togo
Ich übe erst seid kurzem mit Blender und Python. Dann liegt der Fehler bei mir, tut mir leid. Vielleicht zeigen folgende Scripte die ich zum Speichern/Laden verwende, den Fehler auf.
Das Script das ich zum Speichern verwenden:
Code: Alles auswählen
import bge
from bge import logic
path = logic.expandPath('//')
xListe = [[0, 0, 1, 1], [0, 1, 1], [0, 1, 0, 1], [0, 1, 1, 0, 1]]
#Speichern
def save():
gameListe = open(path+'SaveLoad.txt', 'w')
gameListe.write(str(xListe))
def main():
save()
main()
Das Script das ich zum Laden verwenden:
Code: Alles auswählen
import bge
import ast
from bge import logic
path = logic.expandPath('//')
yListe = []
#laden
def load():
gameListe = open(path+'SaveLoad.txt', 'r')
yListe.append(gameListe.readline())
load()
yListe = ast.literal_eval(yListe[0])
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Freitag 31. August 2018, 09:12
von __deets__
Na "str(liste)" macht eben einen String aus einer Liste. Das ist ja nicht weiter verwunderlich. Hat aber auch mit Blender nix zu tun.
Wenn du Datenstrukturen speichern willst, gibt es diverse Moeglichkeiten. Dieser Tage benutzen viele, mir inklusive, json:
Code: Alles auswählen
import json
with open(path) as inf:
data = json.load(inf)
with open(path, "w") as outf:
json.dump(data, outf)
Und schon kannst du dir das literal-eval sparen. Ein paar weitere Anmerkungen:
- Pfade baut man nicht mit + zusammen. Sondern mit os.path.join. Generell benutzt man + sehr, sehr, sehr selten. "ein string mit {)".format("platzhalter") ist die uebliche Vorgehensweise.
- benutze das with-statement zum oeffnen und impliziten schliessen. Du schliesst deine Dateien nicht, das kann zu Problemen fuehren.
- KEINE GLOBALEN VARIABLEN BENUTZEN! So etwas wie du mit yListe gemacht hast, ist hochgefaehrlich. Globale Variablen sind die dunkle, verfuehrerische Seite der Macht. Verfuehrerisch und einfach am Anfang, aber sie werden zu zaehnefletschenden Debugging-Monstern aus der Hoelle. Stattdessen vernuenftige Funktionen benutzen, deren Ausgaben sie per return verlassen:
Code: Alles auswählen
def load(path):
with open(path) as inf:
return json.load(inf)
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Freitag 31. August 2018, 09:15
von Sirius3
Funktionen sollten alles was sie brauchen, über Argumente bekommen und Ergebnisse als Rückgabewerte zurückliefern. Globale Listen benutzt man dafür nicht. Dateien die man öffnet, sollte man auch wieder schließen, am besten benutzt man das with-Statement dafür. Die Stringrepräsentation von Listen ist nur für Debugzwecke gedacht, nicht zum Speichern. Pfade setzt man per os.path.join zusammen.
Code: Alles auswählen
FILENAME = logic.expandPath('//SaveLoad.txt')
def save(numbers):
with open(FILENAME, 'w') as output:
json.dump(numbers, output)
def load():
with open(FILENAME) as output:
return json.load(output)
x_values = [[0, 0, 1, 1], [0, 1, 1], [0, 1, 0, 1], [0, 1, 1, 0, 1]]
save(x_values)
y_values = load()
Re: Geschachtelte Liste (str) umwandeln in (int)
Verfasst: Freitag 31. August 2018, 15:07
von togo
Vielen vielen Dank,
für die Korrektur und Anmerkungen zu JSON, Pfade, Globale Variablen.
Für mich als Anfänger ist es wie im Glücksspiel, die richten Tutorials bzw Quellen aus der Masse zu finden. Im ersten Moment bin ich froh, dass es funktioniert. Doch für die Qualität bzw Richtigkeit fehlt mir halt noch das entsprechende Wissen.