pop und del

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
Bob Billsworth
User
Beiträge: 11
Registriert: Freitag 12. Juni 2015, 00:01

Hallo Zusammen :D

Code: Alles auswählen

i = 0
while i <= h:  #h = 106
    name = open("idaxp_"+str(i),"rb")
    idax = pickle.load(name)
    name.close()
    j = 0
    while j <= len(idax)-1:
        if idax[j][1][:+2] == "08" or idax[j][1][:+2] == "09" or idax[j][1][:+2] == "10" ... :
            idax[j][1] = idax[j][1][:-7]
            idax[j][2] = round(float(idax[j][2]),2)
            idax[j][3] = round(float(idax[j][3]),2)
            idax[j].append((round(((idax[j][2]+idax[j][3])/2),2)))
            idax[j].pop(2)
            idax[j].pop(2)
        else:
            del idax[j]
        j += 1
    name = open("idaxpF_"+str(i), "bw")
    pickle.dump(idax, name)
    name.close()
    i += 1
Folgendes wird ausgegeben, wenn ich (for item in idax: print(item)) eingebe:

['20140101', '00:25:28:832', '9552.14', '9552.18']
['20140101', '00:55:28:905', '9552.136', '9552.183']
['20140101', '01:25:28:876', '9552.143', '9552.186']
['20140101', '01:55:28:945', '9552.134', '9552.179']
['20140101', '02:25:28:856', '9552.138', '9552.177']
['20140101', '02:55:28:852', '9552.136', '9552.176']
['20140101', '03:25:30:977', '9552.139', '9552.178']
['20140101', '03:55:31:054', '9552.139', '9552.185']
['20140101', '04:10:30:987', '9552.139', '9552.186']
['20140101', '04:40:31:048', '9552.136', '9552.183']
['20140101', '05:10:31:057', '9552.139', '9552.178']
['20140101', '05:40:33:098', '9552.138', '9552.186']
['20140101', '06:10:33:090', '9552.14', '9552.186']
['20140101', '06:40:35:139', '9552.141', '9552.177']
['20140101', '07:10:35:140', '9552.137', '9552.176']
['20140101', '07:40:37:167', '9552.134', '9552.175']

['20140101', '08:10:39:139', '9552.144', '9552.172']
['20140101', '08:25', 9552.15]
['20140101', '08:40', 9552.17]
['20140101', '08:55', 9552.16]
['20140101', '09:10', 9552.16]
['20140101', '09:25', 9552.17]
['20140101', '09:40', 9552.17]
['20140101', '09:55', 9552.16]
['20140101', '10:10', 9552.15]
['20140101', '10:25', 9552.16]
...

1. Die kursiv angezeigten Listen dürften eigentlich gar nicht mehr existieren. idax.pop(j) funktioniert auch nicht. Bei beiden Varianten erhalte ich keine Fehlermeldung. Die kursiven Listen werden dennoch nicht gelöscht.

2. Die fett angezeigte Liste ("08") müsste eigentlich wie die unten stehenden Listen formatiert sein.

Vielen Dank im Voraus für Eure Antworten.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Bob Billsworth: Du löschst den Eintrag idax[j] und zählst gleichzeitig j hoch. Das ist bestimmt nicht so beabsichtigt. Statt while-Schleifen solltest Du for-Schleifen nehmen und statt über den Index zu iterieren gleich über die Liste selbst. Statt Elemente aus einer Liste löschen solltest Du eine neue Liste erstellen. Und soll tatsächlich mit gerundeten Werten gerechnet werden? Normalerweise rundet man am Schluß und nur am Schluß.

Code: Alles auswählen

for i in range(h + 1):
    with open("idaxp_%d" % i, "rb") as inp:
        idax = pickle.load(inp)
    result = []
    for date, time, value1, value2 in idax:
        if time.startswith(('08','09','10')):
            result.append([
                date,
                time[:7],
                round(0.5*(float(value1) + float(value2)), 2),
            ])
    with open("idaxpF_%d" % i, "wb") as outp:
        pickle.dump(result, outp)
EDIT: übrigens ist das pickle-Format nur für kurzzeitige Python-interne Aufgaben gedacht. Hier würde sich csv als Format geradezu aufdrängen.
Zuletzt geändert von Sirius3 am Freitag 12. Juni 2015, 08:49, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Sirius3s Beispiel ist übrigens auch noch viel hübscher zu lesen.
Bob Billsworth
User
Beiträge: 11
Registriert: Freitag 12. Juni 2015, 00:01

Vielen Dank für Eure Antworten. :D

Mit dem (for i in range) und dem (for date, time, ...) tun sich für mich neue Welten auf. Ich komme mir wie ein Neandertaler vor. An das csv-Modul hatte ich bereits gedacht; habe mich allerdings noch nicht getraut. Um den Output überprüfen zu können, sollte ich mich jedoch heran wagen.
Antworten