Seite 1 von 1
[4,5,'xx'] ==> [45, 'xx']
Verfasst: Donnerstag 14. Mai 2009, 14:10
von Pascal
Hallo Leute,
ich würde ganz gerne aus der liste [4,5,'xx'] , solch eine liste erzeugen: [45, 'xx']
oder aus [1,2,3, 'a','b','c'] , [123, 'a','b','c'] machen.
also wenn zwei oder mehrere Zahlen hintereinander vorkommen, zu einer zahl zusammen fügen.
kann mir da jemand einen Tipp geben??
Verfasst: Donnerstag 14. Mai 2009, 14:21
von EyDu
Worin genau besteht denn dein Problem, das ist doch eigentlich nur eine kleine Schleife? Vielleicht könntest du auch etwas vom eigentlichen Problem verraten, dein Vorhaben kommt mir etwas merkwürdig vor.
Verfasst: Donnerstag 14. Mai 2009, 14:35
von Pascal
EyDu hat geschrieben: Vielleicht könntest du auch etwas vom eigentlichen Problem verraten
aber gerne doch
die wesentlichelichen Teile des Programms sind folgende:
Code: Alles auswählen
term1='124x+9x-17x+10-6x'
term1=list(term1)
for elemt in term1: #Hier werden jetzt die zahlen in float umgewandelt
try:
float(elemt)
except ValueError:
continue
term1[term1.index(elemt)]=float(elemt)
Ich habe mir gedacht, dass ich das ganze mit Listen am besten lösen kann.
jetzt sieht das ganze aber so aus:
Code: Alles auswählen
[1.0, 2.0, 4.0, 'x', '+', 9.0, 'x', '-', 1.0, 7.0, 'x', '+', 1.0, 0.0, '-', 6.0, 'x']
und aus term1[0:2] soll jetzt 124 werden.
aber dazu muss man erkennen, dass 1,2,4 vom typ float sind.
so weit so gut
aber wie mach ich daraus jetzt eine(!, denn da liegt das Problem bei mir..) Zahl?
Verfasst: Donnerstag 14. Mai 2009, 14:50
von EyDu
Jetzt solltest du dir reguläre Ausdrücke anschauen und dich u.U. nach einem Parser umschauen.
Verfasst: Donnerstag 14. Mai 2009, 14:54
von numerix
Deine Idee zur Zerlegung der Zeichenkette ist unglücklich.
Falls deine Terme nur Addition und Subtraktion enthalten, könntest du es so machen:
Code: Alles auswählen
>>> term = '124x+9x-17x+10-6x'
>>> teile = (term[0]+term[1:].replace('-','+-')).split('+')
>>> teile
['124x', '9x', '-17x', '10', '-6x']
Jetzt musst du nur noch prüfen, ob das letzte Zeichen ein "x" ist ...
Verfasst: Donnerstag 14. Mai 2009, 15:07
von derdon
Falls es deine Hausaufgabe löst, hilft dir vll diese Datei weiter:
http://bitbucket.org/derdon/frog-plotte ... uations.py
Ein Beispiel-Aufruf:
Code: Alles auswählen
$ ./parse_equations.py 124x+9x-17x+10-6x --start=-30 --stop=30 --step=10
+-----+---------+
| x | y |
+=====+=========+
| -30 | -3290.0 |
+-----+---------+
| -20 | -2190.0 |
+-----+---------+
| -10 | -1090.0 |
+-----+---------+
| 0 | 10.0 |
+-----+---------+
| 10 | 1110.0 |
+-----+---------+
| 20 | 2210.0 |
+-----+---------+
| 30 | 3310.0 |
+-----+---------+
Verfasst: Donnerstag 14. Mai 2009, 15:14
von Traggger
So funktioniert es auch recht gut, mußt nur am Ende das Listenelement als Zahl interpretieren wenn du es verarbeitest...
Code: Alles auswählen
#!/usr/bin/env python
if __name__ == "__main__":
myList = [4,5,6,'a','b']
newItem = ""
newList = []
for item in myList:
if str(item).isdigit():
newItem += str(item)
else:
if len(newItem):
newList.append(newItem)
newList.append(item)
newItem = ""
print newList
ok... Jetzt war ich zu langsam

...
hier die floatingPoint Variante:
Code: Alles auswählen
#!/usr/bin/env python
if __name__ == "__main__":
myList = [4.0 ,5.5 ,6.5,'a','b']
newItem = ""
newList = []
for item in myList:
if str(item).split(".")[0].isdigit():
newItem += str(item).split(".")[0]
else:
if len(newItem):
newList.append(newItem)
newList.append(item)
newItem = ""
print newList
Verfasst: Donnerstag 14. Mai 2009, 15:14
von Pascal
Danke numerix!
der Gebrauch von replace und split waren mir nicht bekannt
Allerdings komm ich damit noch nicht ganz ans Ziel
aus '124x' brauch ich 124, 'x' , also die 124 als float, aber ich glaub das schaff ich auch alleine
,hoff ich mal
Es handelt sich dabei übrigens nicht um eine Hausaufgabe.
Verfasst: Donnerstag 14. Mai 2009, 16:13
von Pascal
@Traggger
hab deine lösung eben erst gesehen, wir haben wohl fast zeitgleich geschrieben
ich bleib jetzt aber bei der lösung von numerix, obwohl mir dein Weg gefällt, ich hab mich jetzt auf variante auf numerix konzentriert, kann aber gut sein das ich das nochmal brauchen werde
also nochmal ein fettes
Dankeschön
Pascal
Verfasst: Donnerstag 14. Mai 2009, 17:16
von numerix
Pascal hat geschrieben:Allerdings komm ich damit noch nicht ganz ans Ziel
aus '124x' brauch ich 124, 'x' , also die 124 als float, aber ich glaub das schaff ich auch alleine
,hoff ich mal
Ich wollte ja nicht alles für dich machen.
Wenn du das mit dem x am Ende nicht selbst hinbekommst, dann wäre es Zeit für einen längeren Blick ins Tutorial.

Stichworte könnten sein: Slicing und Zeichenkettenmethoden.
Verfasst: Donnerstag 14. Mai 2009, 21:13
von sma
Hat jemand
Kombinator-Parser gesagt? Nein? Schade :)
Stefan
Verfasst: Freitag 15. Mai 2009, 08:06
von mkesper
Cooles Ding, was für mich nur erstmal seltsam aussieht ist ein Aufruf wie
anstelle von
.
Verfasst: Freitag 15. Mai 2009, 14:13
von sma
term ist eine Funktion, die bei Aufruf eine Funktion liefert.
Um term aufzurufen, brauche ich die ersten (). Um dann die zurückgelieferte Funktion (den Parser) aufzurufen, kommen die zweiten () mit dem Argument ins Spiel. Was da dann zurück kommt, ist übrigens ein Tupel, dessen zweiter Wert schon wieder eine Funktion (genauer ein Objekt, das callable ist) ist und auch diese Funktion kann ich (mit dem Argumentwert für X) aufrufen.
Übrigens: Die Klassen für Lit, X, usw. sind eigentlich ein Fremdkörper. Schöner unter funktionalen Gesichtspunkten wäre:
Code: Alles auswählen
def Lit(v): return lambda x: v
def X(): return lambda x: x
def Op(op): return lambda l, r: lambda x: op(l(x), r(x))
Mul = Op(int.__mul__)
Add = Op(int.__add__)
Sub = Op(int.__sub__)
Da sind dann wieder die Funktionen, die Funktionen liefern. Eine Klasse bei Python ist nämlich gar nicht so anders: Auch sie ist wie eine Funktion, die Exemplare von sich liefert.
Stefan