Seite 1 von 1
String mit Zahlen in Liste umwandeln
Verfasst: Dienstag 6. Januar 2009, 18:39
von dorooo
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
Verfasst: Dienstag 6. Januar 2009, 18:54
von Hyperion
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 ...
Verfasst: Dienstag 6. Januar 2009, 19:05
von dorooo
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...
Verfasst: Dienstag 6. Januar 2009, 19:10
von cofi
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.
Verfasst: Dienstag 6. Januar 2009, 19:22
von dorooo
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']]
Verfasst: Dienstag 6. Januar 2009, 19:23
von Leonidas
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?
Verfasst: Dienstag 6. Januar 2009, 19:25
von Hyperion
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

Verfasst: Dienstag 6. Januar 2009, 19:30
von dorooo
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...
Verfasst: Dienstag 6. Januar 2009, 19:37
von Leonidas
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?
Verfasst: Dienstag 6. Januar 2009, 19:38
von Hyperion
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 ...
Verfasst: Dienstag 6. Januar 2009, 20:36
von numerix
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.
Verfasst: Dienstag 6. Januar 2009, 21:08
von 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()`.
Verfasst: Mittwoch 7. Januar 2009, 09:32
von dorooo
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

)
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
Verfasst: Mittwoch 7. Januar 2009, 09:53
von dorooo
also der tipp mit "save" und "load" ist wunderbar!
danke BlackJack

hab jetzt das was ich wollte und es geht so einfach...
