Seite 1 von 1

rückwärts über Liste

Verfasst: Freitag 11. November 2005, 16:54
von Mr_Snede
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

Verfasst: Freitag 11. November 2005, 17:15
von mawe
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

Verfasst: Freitag 11. November 2005, 17:19
von Mawilo
Hallo,

schau dir das mal an.

Stephan

Verfasst: Freitag 11. November 2005, 17:47
von Mr_Snede
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

Verfasst: Samstag 12. November 2005, 14:27
von Mr_Snede
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

Verfasst: Samstag 12. November 2005, 17:14
von jens

Verfasst: Samstag 12. November 2005, 17:16
von joe
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

Verfasst: Samstag 12. November 2005, 17:28
von Mr_Snede
Auf die Schnelle:

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

cu Sebastian

Verfasst: Sonntag 13. November 2005, 03:32
von Joghurt
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...

Verfasst: Sonntag 13. November 2005, 19:15
von mawe
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? :)

Verfasst: Sonntag 13. November 2005, 21:13
von Mr_Snede
@ 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

Verfasst: Montag 14. November 2005, 09:31
von jens
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 ;)

Verfasst: Montag 14. November 2005, 13:44
von Leonidas
reversed() liefert einen Iterator im Gegensatz zu [::-1], also wenn ihr Generatoren mögt :D

Verfasst: Montag 14. November 2005, 22:36
von BlackJack
Und bei `reversed()` wird die Liste nicht umgedreht. Dürfte also schneller sein.

Verfasst: Montag 14. November 2005, 23:22
von Mr_Snede
@ 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

Verfasst: Dienstag 15. November 2005, 18:21
von Joghurt
Du hast immer noch nicht reversed benutzt, böser Mr_Snede 8)