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??
[4,5,'xx'] ==> [45, 'xx']
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.
Das Leben ist wie ein Tennisball.
aber gerne dochEyDu hat geschrieben: Vielleicht könntest du auch etwas vom eigentlichen Problem verraten
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)
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']
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?
Deine Idee zur Zerlegung der Zeichenkette ist unglücklich.
Falls deine Terme nur Addition und Subtraktion enthalten, könntest du es so machen:
Jetzt musst du nur noch prüfen, ob das letzte Zeichen ein "x" ist ...
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']
Falls es deine Hausaufgabe löst, hilft dir vll diese Datei weiter: http://bitbucket.org/derdon/frog-plotte ... uations.py
Ein Beispiel-Aufruf:
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 |
+-----+---------+
So funktioniert es auch recht gut, mußt nur am Ende das Listenelement als Zahl interpretieren wenn du es verarbeitest...
ok... Jetzt war ich zu langsam ...
hier die floatingPoint Variante:
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
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
Zuletzt geändert von Traggger am Donnerstag 14. Mai 2009, 15:18, insgesamt 1-mal geändert.
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.
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.
@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
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
Ich wollte ja nicht alles für dich machen.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
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.
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
Cooles Ding, was für mich nur erstmal seltsam aussieht ist ein Aufruf wiesma hat geschrieben:Hat jemand Kombinator-Parser gesagt? Nein? Schade
Stefan
Code: Alles auswählen
term()(Argument)
Code: Alles auswählen
term(Argument)
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:
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
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__)
Stefan