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

String teilweise auswerten

Beitragvon Carsten1983 » Freitag 21. November 2008, 11:13

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[i]' 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

Beitragvon BlackJack » Freitag 21. November 2008, 11:20

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

Beitragvon Carsten1983 » Freitag 21. November 2008, 12:42

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

Beitragvon sma » Samstag 22. November 2008, 11:21

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

Beitragvon BlackJack » Samstag 22. November 2008, 12:17

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

Beitragvon sma » Samstag 22. November 2008, 12:23

Ach so, habe ich nicht aufgepasst :cry:

Wer ist online?

Mitglieder in diesem Forum: /me, Bing [Bot]