rückwärts über Liste

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.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Freitag 11. November 2005, 16:54

Hallo,
ich will aus dem Kontoendstand (den man ja nach einem Kontoauszug hat) rückwärts mit einer Liste der Kontobewegungen die Beträge errechnen,
die durch die einzelnen Kontobewegungen entstanden sind.
Damit will ich einen Grafen zeichnen[1].

Nach einem viel aufwendigerem Ansatz und rumprobieren über die letzten Tage,
bin ich schließlich zur folgenden Funktion gekommen:

Code: Alles auswählen

konto_bewegungen = [10.0,12.0,7.0,-3.1,7.2,-32.7,6.0]

def absolute_betraege(betrags_liste):
    konto_end_stand = 32.0
    neuer_wert = 0

    betrags_liste.reverse()

    for i in xrange(len(betrags_liste)):
        #   ziehe Betrag von neuer_wert ab
        #   speicher das Ergebnis in neuer_wert
        neuer_wert = neuer_wert - betrags_liste[i]
        betrags_liste[i] = neuer_wert

    betrags_liste.reverse()
    return betrags_liste

absolute_betraege(konto_bewegungen)
Ich wollte mal fragen, wie ihr das angegengen wärt. Irgendwie gefällt es mir nicht die Liste zweimal umzudrehen.

Kann man da vielleicht gar was mit List Comprehensions machen?

cu Sebastian




[1] http://spuddel.sp.funpic.de/dokuwiki2/d ... ontolister
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Freitag 11. November 2005, 17:15

Hi!

Naja, was viel gescheiteres fällt mir da auch nicht ein. Du kannst natürlich über eine Liste rückwärts iterieren mit

Code: Alles auswählen

for i in reversed(liste)
oder

Code: Alles auswählen

for i in liste[::-1]
Ich hätts wahrscheinlich irgendwie so gemacht (auf die Schnelle :)):

Code: Alles auswählen

konto_bewegungen = [10.0, 12.0, 7.0, -3.1, 7.2, -32.7, 6.0]

def absolute_betraege(betrags_liste):
    neuer_wert = 0
    neue_liste = []

    for betrag in reversed(betrags_liste):
        neuer_wert -= betrag
        neue_liste.insert(0,neuer_wert)

    return neue_liste

print absolute_betraege(konto_bewegungen)
Wie gesagt, nicht wirklich besser :?

Gruß, mawe
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Freitag 11. November 2005, 17:19

Hallo,

schau dir das mal an.

Stephan
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Freitag 11. November 2005, 17:47

Cool, danke erstmal.
Über reversed() bin ich schon im Pythonwiki unter den Neuigkeiten gestolpert - habe es aber bei menen Übungen anscheinend falsch eingesetzt.

Habe gleich erstmal Nachtschicht und schaue dann morgen weiter.

cu Sebastian
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Samstag 12. November 2005, 14:27

Bin über reversed gestolpert, weil ich in debian testing noch auf Python 2.3.5 bin.
leider sind die pmw nur für < 2.4 verfügbar, ein Update scheidet also aus.

Kann ich mir reversed() mit from __future__ import holen?

Code: Alles auswählen

from __future__ import reversed()
und auch

Code: Alles auswählen

from __future__ import reversed
haben es nicht gebracht und

Code: Alles auswählen

from __future__ import *
scheint erst garnicht vorgesehen zu sein.

cu Sebastian
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Samstag 12. November 2005, 17:14


CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
joe

Samstag 12. November 2005, 17:16

Mr_Snede hat geschrieben:leider sind die pmw nur für < 2.4 verfügbar, ein Update scheidet also aus.
Bei mir läuft pmw unter 2.4.2 problemlos. Ich glaub, ich hab beim versionswechsel nur einfach den pmw-baum aus site-packages rüberkopiert. Und da pmw afaik reines python ist, darf es ja auch eigentlich keine probleme geben.
joe
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Samstag 12. November 2005, 17:28

Auf die Schnelle:

Danke euch zwei,
ich werde es ausprobieren (vielleicht dieses Wochende noch)

cu Sebastian
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Sonntag 13. November 2005, 03:32

Mr_Snede hat geschrieben:

Code: Alles auswählen

from __future__ import *
scheint erst garnicht vorgesehen zu sein.
Und auch mit gutem Grund. Stelle dir mal vor, es gäbe irgendwann ein "from __future__ import SwapTrueAndFalse" oder ähnliches...
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Sonntag 13. November 2005, 19:15

Wie ich schon in meinem erstem Post geschrieben hab, kannst Du statt reversed() ja auch for i in liste[::-1] verwenden. Oder hat das für Dich gravierende Nachteile? :)
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Sonntag 13. November 2005, 21:13

@ mawe
Meine Tests haben mit liste[::-1] funktioniert.
Mein Problem ist, dass ich für das Programmieren nur hin und wieder Zeit habe und Programmierfähigkeiten dementsprechend nur langsam (viel zu langsam) steigen.
Nach 1-2 Monaten erkenne ich den Sinn von reversed(liste) schneller als von liste[::-1].
Ich habe mich also entschieden meine Anfangs vorgestellte Lösung mit dem zweimaligen Umdrehen zu benutzen (hat schon wieder etwas so verqueres, dass ich mich schnell dran erinnere) bis Python2.4 in debian Testing als default Einzug erhält.
Allerdings habe ich neuer_wert -= betrag übernommen.
Aber keine Sorge, dein Vorschlag ist in meiner Sammlung an Beispielen aufgenommen wird also auch sicherlich irgendwo von mir eingesetzt.

@Joghurt
habe

Code: Alles auswählen

from __future__ import *
auch eher zu Testzwecken ausprobiert und das Ergebnis schon erwartet.


@ all
Danke für eure Hilfe und Ideen an diesem Stück Code.
Da er läuft haben im Moment andere Baustellen in meinem Programm vorrang, die zu einer sinnvollen Nutzbarkeit sorgen. Denn im Moment ist es eher eine Machbarkeitsstudie Meinerseits.

cu Sebastian
Benutzeravatar
jens
Moderator
Beiträge: 8483
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Montag 14. November 2005, 09:31

Mr_Snede hat geschrieben:Nach 1-2 Monaten erkenne ich den Sinn von reversed(liste) schneller als von liste[::-1].
Da hast du sicherlich recht, aber pack doch einfach ein Kommentar dazu ;)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Leonidas
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Montag 14. November 2005, 13:44

reversed() liefert einen Iterator im Gegensatz zu [::-1], also wenn ihr Generatoren mögt :D
My god, it's full of CARs! | Leonidasvoice vs Modvoice
BlackJack

Montag 14. November 2005, 22:36

Und bei `reversed()` wird die Liste nicht umgedreht. Dürfte also schneller sein.
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Montag 14. November 2005, 23:22

@ BlackJack
Ja, in der Doku steht dass reversed() deutlich schneller ist, kann die Stelle aber gerade nicht mehr finden.

@ Jens
Ok-ok ich nehm's ja schon (bevor ich noch Haue bekomme) :-)

Vielleicht hilft es ja jemanden, so sieht die Funktion jetzt aus:

Code: Alles auswählen

def betraege(betrags_liste):
    neuer_wert = 0
    neue_liste = []

    # iteriere rueckwaerts ueber betrags_liste
    for i in betrags_liste[::-1]:
        #   ziehe Betrag von neuer_wert ab
        #   speicher das Ergebnis in neuer_wert
        neuer_wert -= i
        neue_liste.insert(0,neuer_wert)

    return neue_liste
cu Sebastian
Antworten