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 :idea:

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 :idea:
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. :wink:
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
sma hat geschrieben:Hat jemand Kombinator-Parser gesagt? Nein? Schade :)
Stefan
Cooles Ding, was für mich nur erstmal seltsam aussieht ist ein Aufruf wie

Code: Alles auswählen

term()(Argument)
anstelle von

Code: Alles auswählen

term(Argument)
.

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