String teilweise auswerten

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
Carsten1983
User
Beiträge: 20
Registriert: Montag 9. Juni 2008, 14:17
Wohnort: Halle/Saale

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.
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
Carsten1983
User
Beiträge: 20
Registriert: Montag 9. Juni 2008, 14:17
Wohnort: Halle/Saale

Danke für die wirklich kompakte und prompte Hilfe. Habs gerade ausprobiert und da hats auch gleich funktioniert
:D
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
BlackJack

Das löst irgend wie die Aufgabenstellung gar nicht!?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ach so, habe ich nicht aufgepasst :cry:
Antworten