String mit Zahlen in Liste umwandeln

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
dorooo
User
Beiträge: 10
Registriert: Dienstag 6. Januar 2009, 18:30

Hallo,
ich habe mich schon durch unzählige Foren geklickt, aber die Antwort habe ich noch nicht gefunden.
Ich möchte einen String, der wie folgt aussieht:

'[1/2, 0, -1/2, 1]\n'

in eine Liste [1/2, 0, -1/2, 1] umwandeln.
Mit eval klappt das leider nicht, weil dann die Brüche zu Integers umgewandelt werden.

Mein Code sieht in etwa so aus:

Code: Alles auswählen

Zykel = []
zobj = open("zykel.txt", "r")
for line in zobj:
    Zykel.append(line)
zobj.close()
wobei in zykel.txt so aussieht (vgl oben):

[1/2, 0, -1/2, 1]
[-3/2, 1, 1/2, 1]
[-3, 1, 1, 1]
[0, -1, 0, 1]

Ich hoffe, ich habe mich verständlich ausgedrückt und hoffe auf verständliche Antworten!
Danke
Gruß Doro
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Also ich kenne da jetzt kein spezielles Tool, aber generell musst Du wohl die einzelnen Strings parsen! Wenn das Format immer nur dermaßen beschränkt ist, kann man das sicher mit den Basis-String Operationen machen (split() usw.). Ansonsten ggf. per RegExp oder gar einem echten Parser-Generator.

Wo kommten denn die Daten her? Ggf. könnte man die ja auch direkt anders und Python-konformer ausgeben ...
dorooo
User
Beiträge: 10
Registriert: Dienstag 6. Januar 2009, 18:30

danke für die antwort

und wie parse ich das?

die daten kommen aus einem anderen programm (das ist die ausgabe, die ich in die .txt datei geschrieben hab) und diese will ich mit dem programm weiter verwenden.

man kann das bestimmt anders machen, ich weiß aber nicht wie...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Code: Alles auswählen

Zykel = []
with ("zykel.txt") as zobj:
    for line in zobj:
        Zykel.append([value for value in line.strip("[]").split(",")])
Das belässt das ganze in Strings ... evtl wäre das fractions-Modul interessant wenn du mit den Brüchen was machen willst.
dorooo
User
Beiträge: 10
Registriert: Dienstag 6. Januar 2009, 18:30

hi
das hört sich schonmal gut an!
das problem ist, es funktioniert bei mir nicht,
nutze das programm "sage" (nicht rein python - da sind schon die brüche dabei ;-))
"sage" hat probleme mit "with" und "as"
und wenn ich das so:

Code: Alles auswählen

Zykel = []
zobj = open("zykel.txt", "r")
for line in zobj:
    Zykel.append([value for value in line.strip("[]").split(",")])
zobj.close()
ausführe, ist die ausgabe wieder der art:

Code: Alles auswählen

[['1/2', ' 0', ' -1/2', ' 1]\n'],
 ['-3/2', ' 1', ' 1/2', ' 1]\n'],
 ['-3', ' 1', ' 1', ' 1]\n']]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Hallo dorooo, willkommen im Forum,

Das sieht mir auch wieder wie ein XY-Problem aus. Was für ein Problem willst du eigenlich lösen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die Frage ist ja, wie die finale Liste aussehen soll! Wenn er wirklich echte Brüche haben will / muss, dann kommt er da nicht drum herum. Reichen Fließkommazahlen kann er ja irgend wann per float() das ganze wandeln.

Lässt er die Strings stehen hat er zwar eine Liste mit einzelnen Elementen, kann damit aber ja nicht wirklich was anfangen ...

Ok, ich verlasse mich mal auf mein /dev/glaskugel Device, dass er auch etwas mit den Listen machen will außer sie anzugucken ;-)
dorooo
User
Beiträge: 10
Registriert: Dienstag 6. Januar 2009, 18:30

ich will echte brüche :)
die liste wird dann teil einer matrix.
also bei sage: M = matrix(QQ, 2, liste) ergibt
[1/2 0
-1/2 1]

mit der ich dann weiter arbeiten will.
sage ist ein matheprogramm, da ist der ganze kram schon dabei (brüche, matrizen,...),
aber man muss dafür halt python können...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und die Brüche erstmal in eine Textdatei zu speichern und sie dann Qualvoll auszulesen und in die selben Bruch-Objekte umzuwandeln, die sie vor dem abspeichern waren macht es einfacher?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie werden denn Brüche in sage gehandelt? Evtl. haben die ja einen Cast-Mechanismus von String in einen Bruch? Dann bräuchtest Du da nicht viel selber machen ...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

dorooo hat geschrieben:ich will echte brüche :)
Dann wirst du dir selbst was basteln müssen, denn Python bringt erst ab Version 2.6 im fractions-Modul die Bruchrechnung und -darstellung mit. Da sage nach deiner Angabe mit "with" und "as" nichts anfangen kann, wird eine Python-Version <2.6 verwendet, folglich ohne fractions-Modul.

Einen Zahlenwert "1/2" gibt es nicht. Entweder es ist eine Zeichenkette oder es wird als Rechenoperation ausgewertet, in deinem Fall mit Python <3.0 sogar zu 0.
BlackJack

Sage ist ein Matheprogramm in Python und hat Unterstützung für Brüche.

@dorooo: Nochmal die Frage wo die Daten herkommen!? Falls sie aus einem Programm kommen, das Sage verwendet, wäre es besser die entsprechenden `load()`- und `save()`-Methoden zu verwenden. Such mal in der Doku nach "persistence". Und jetzt, wo's schon zu spät ist: `sage_eval()`.
dorooo
User
Beiträge: 10
Registriert: Dienstag 6. Januar 2009, 18:30

danke für die vielen antworten!

mal schauen, was ich damit anfangen kann.
ich bin kein guter programmierer (das habt ihr euch
jetzt wahrscheinlich eh schon gedacht :lol: )

bei sage hab ich auch noch keine methoden gefunden,
kann aber auch sein, dass ich nicht wusste, wonach
ich suchen soll.

jetzt hab ich auf jeden fall ein paar neue ideen - danke
dorooo
User
Beiträge: 10
Registriert: Dienstag 6. Januar 2009, 18:30

also der tipp mit "save" und "load" ist wunderbar!
danke BlackJack :!:
hab jetzt das was ich wollte und es geht so einfach... :oops:
Antworten