Seite 1 von 1

String teilweise auswerten

Verfasst: Freitag 21. November 2008, 11:13
von Carsten1983
Hallo allerseits,

ich weiß es gab schon viele Fragen bezüglich der Stringumwandlung und Auswertung. Dennoch möchte ich dieses Thema in die nächste Runde schicken. Ich möchte gern einen String, der eigentlich eine Formel mit vielen Koeffizienten darstellt verändern. In der ursprünglichen Darstellung sind alle Koeffiezienten durch ein Feld p aus gedrückt:

p = [1,3]

Das kommt als String an:

y = 'p[0] + x*p[1]..'

Diesen String möchte ich nur dahingehend auswerten, dass ich alle 'p' durch die zugehörigen Zahlen ersetze, aber das x einfach stehen lasse:

y = '1 + x*3'

Die einzige Lösung die ich bis jetzt gesehen habe, wäre den String der Reihe nach durchzugehen, die Indizes für 'p' und ']' zu erkennen und dann mithilfe von eval(y[0:4]) Teile des Strings umzuschreiben.

Meine Frage dazu lautet: Geht das nicht vielleicht einfacher, eleganter (aber ohne großen Aufwand)

mfg

p.s:
Die Sicherheit liegt mir dabei nicht am Herzen, und es wird an der Stelle schon eine fehlerfreie Eingabe des Strings vorraus gesetzt.

Verfasst: Freitag 21. November 2008, 11:20
von BlackJack
Auch wenn Dir Sicherheit nicht am Herzen liegt, würde ich es ohne `eval()` machen:

Code: Alles auswählen

import re


def main():
    coefficients = [1, 3]
    formula = 'p[0] + x*p[1]'
    result = re.sub(r'p\[(\d+)\]',
                    lambda m: str(coefficients[int(m.group(1))]),
                    formula)
    print result

Verfasst: Freitag 21. November 2008, 12:42
von Carsten1983
Danke für die wirklich kompakte und prompte Hilfe. Habs gerade ausprobiert und da hats auch gleich funktioniert
:D

Verfasst: Samstag 22. November 2008, 11:21
von sma
Mein Vorschlag wäre dies:

Code: Alles auswählen

p = [1,3]
y = "p[0] + x*p[1]"
f = eval("lambda x:" + y)
for i in range(10): print f(i)
Stefan

Verfasst: Samstag 22. November 2008, 12:17
von BlackJack
Das löst irgend wie die Aufgabenstellung gar nicht!?

Verfasst: Samstag 22. November 2008, 12:23
von sma
Ach so, habe ich nicht aufgepasst :cry: