Geschachtelte Liste (str) umwandeln in (int)

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
togo
User
Beiträge: 4
Registriert: Donnerstag 30. August 2018, 15:10

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.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

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])
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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]]
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
togo
User
Beiträge: 4
Registriert: Donnerstag 30. August 2018, 15:10

__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.
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich arbeite auch mit Blender, und das ist ganz bestimmt NICHT so. Ich speichere das problemlos Daten zb als JSON etc.
togo
User
Beiträge: 4
Registriert: Donnerstag 30. August 2018, 15:10

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])
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)

Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
togo
User
Beiträge: 4
Registriert: Donnerstag 30. August 2018, 15:10

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.
Antworten