rückwärts über Liste oder wie hättet ihrs gelöst?

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

Habe mein uraltes Projekt einer kleinen Kontoverwaltung wieder ausgegraben.

Grundlage ist, dass ich bei der Sparkasse eine Liste von Buchungen herunterladen kann. Der Kontoabschluß stellt den "Kontoendstand" dar. Von dem aus wird zu jeder Buchung ein Buchungsergebnis errechnet.
Später wird aus diesen Buchungsergebnissen ein 2D-Plot erzeugt.

Dies ist eine, nur zum Testen, ausgelagerte Routine, die mir bis hier hin viel Kopfzerbrechen bereitet hat. Aber jetzt funktioniert sie.
Die Zeilen Nummern sind nur für mich da, um die Ausgabe mit meinem Wunschergebnis besser vergleichen zu können.

Schaut mal drüber, wo gibt es noch Verbesserungen?

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-

KONTO_STARTSTAND = 0
KONTO_ENDSTAND = 1000.00
BUCHUNGEN = [-15.00, -100.00, -40.00, 500.00, -350.00]

""" Erwartetes Ergebnis:
Rechnung ausgehend vom KONTO_ENDSTAND = 1000.0

  Zeile Nr  | Buchung  |  Ergebnis der Buchung
------------+----------+----------------------
        1   | -15.00,  |  990.0
        2   | -100.00, |  890.0
        3   | -40.00,  |  850.0
        4   | 500.00,  | 1350.0
        5   | -350.00  | 1000.0

Danach sollte KONTO_STARTSTAND = 1005.0  sein."""

def main(startstand, buchungen, endstand):
    ergebnis = []
    for i, elem in enumerate(reversed(buchungen)):
        if i > 0:
            ergebnis.insert(0,
                                [len(buchungen)-i,
                                elem,
                                ergebnis[0][2] - ergebnis[0][1] ]
                            )
        else:
            # Setze in letzte Zeile den endstand ein
            ergebnis.append([len(buchungen), buchungen[-1],endstand])

    startstand = ergebnis[0][2] - ergebnis[0][1]
    print "ergebnis: ", ergebnis
    print "startstand: ", startstand


if __name__ == '__main__':
    main(KONTO_STARTSTAND, BUCHUNGEN, KONTO_ENDSTAND)

Code: Alles auswählen

snede@knecht:~/Dokumente/konto$ python "calc_absolute_betraege.py"
ergebnis:  [[1, -15.0, 990.0], [2, -100.0, 890.0], [3, -40.0, 850.0], [4, 500.0, 1350.0], [5, -350.0, 1000.0]]
startstand:  1005.0
Danke Sebastian
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würde versuchen die Liste nach den Berechnungen anzulegen:

Code: Alles auswählen

In [35]: BUCHUNGEN = [-15.00, -100.00, -40.00, 500.00, -350.00]

In [36]: BUCHUNGEN.insert(0, 0)

In [37]: saldo = KONTO_ENDSTAND

In [38]: saldi = [saldo]

In [39]: for satz in reversed(BUCHUNGEN[1:]):
   ....:     saldo -= satz
   ....:     saldi.append(saldo)
   ....:
   ....:

In [40]: saldi
Out[40]: [1000.0, 1350.0, 850.0, 890.0, 990.0, 1005.0]

In [41]: konto = zip(BUCHUNGEN, reversed(saldi))

In [42]: konto
Out[42]:
[(0, 1005.0),
 (-15.0, 990.0),
 (-100.0, 890.0),
 (-40.0, 850.0),
 (500.0, 1350.0),
 (-350.0, 1000.0)]
Damit spart man sich die Veränkungen mit dem if...else und den ganzen Indizes.

Wozu man den Startstand allerdings übergeben muss, ist mir schleierhaft!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Danke Hyperion,
so schauts es gleich viel Besser aus.
Hyperion hat geschrieben:Wozu man den Startstand allerdings übergeben muss, ist mir schleierhaft!
Hat hier absolut keinen Sinn.
Habe es beim Vorbereiten des Codeschnipsels schlicht übersehen.

Stammt aus der Idee die Saldi sowohl vom Kontoendstand als auch vom Startwert aus zu berechnen. Letzteres ist aber nicht mehr aktuell.
Antworten