[4,5,'xx'] ==> [45, 'xx']

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
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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??
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Jetzt solltest du dir reguläre Ausdrücke anschauen und dich u.U. nach einem Parser umschauen.
Das Leben ist wie ein Tennisball.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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 ...
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

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 |
+-----+---------+
Benutzeravatar
Traggger
User
Beiträge: 27
Registriert: Mittwoch 17. Dezember 2008, 11:33
Wohnort: Regensburg

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
Zuletzt geändert von Traggger am Donnerstag 14. Mai 2009, 15:18, insgesamt 1-mal geändert.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

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.
Pascal
User
Beiträge: 271
Registriert: Samstag 4. April 2009, 22:18

@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
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Hat jemand Kombinator-Parser gesagt? Nein? Schade :)

Stefan
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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)
.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Antworten