Datenstruktur in Schleife auslesen

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
thorbytes
User
Beiträge: 37
Registriert: Samstag 24. Februar 2007, 17:38
Kontaktdaten:

Samstag 24. März 2007, 08:08

Hallo,

also irgendwo hab ich einen Denkfehler drin. Vielleicht kann mir hier jemand mal auf die Sprünge helfen.

Also, ich habe folgende Datenstruktur:

Code: Alles auswählen

content = {'name': 'Hans Maier', 'type': 'Tester',
            'times': [{'title': 'Test 1', 'minutes': 1, 'seconds': 35},
                       {'title': 'Test 2', 'minutes': 5, 'seconds': 52},
                       {'title': 'Test 3', 'minutes': 7, 'seconds': 10},
                       {'title': 'Test 4', 'minutes': 10, 'seconds': 22},
                       {'title': 'Test 5', 'minutes': 12, 'seconds': 17},
                       {'title': 'Test 6', 'minutes': 2, 'seconds': 34},
                       {'title': 'Test 7', 'minutes': 9, 'seconds': 50},
                       {'title': 'Test 8', 'minutes': 4, 'seconds': 01},
                       {'title': 'Test 9', 'minutes': 7, 'seconds': 33},
                       {'title': 'Test 10', 'minutes': 7, 'seconds': 25}]}
Diese möchte ich nun mit folgendem Code ausgeben:

Code: Alles auswählen

print "%s - %s\n" % (content['name'], content['type'])

i = 1

for times in content:
    time = content['times'][i-1]
    print "%2d. %s (%d:%02d)" % (i, time['title'], time['minutes'], time['seconds'])
    i+=1
Die Ausgabe sieht so aus:

Code: Alles auswählen

Hans Maier - Tester

 1. Test 1 (1:35)
 2. Test 2 (5:52)
 3. Test 3 (7:10)
Warum werden hier nur die ersten drei Einträge aus der Liste 'times' ausgegeben?
Benutzeravatar
Mawilo
User
Beiträge: 446
Registriert: Sonntag 22. Februar 2004, 10:58
Wohnort: Sachsen
Kontaktdaten:

Samstag 24. März 2007, 08:59

Hallo thorbytes,

du iterierst nur über das Dictionary content und das hat nur drei Einträge.
Du musst in dem Dictionary über die Liste times iterieren.

Code: Alles auswählen

for times in content['times']:
    time = content['times'][i-1]
    print "%2d. %s (%d:%02d)" % (i, time['title'], time['minutes'], time['seconds'])
    i+=1
Ich bekomme dann folgende Ausgabe:

Code: Alles auswählen

Hans Maier - Tester

 1. Test 1 (1:35)
 2. Test 2 (5:52)
 3. Test 3 (7:10)
 4. Test 4 (10:22)
 5. Test 5 (12:17)
 6. Test 6 (2:34)
 7. Test 7 (9:50)
 8. Test 8 (4:01)
 9. Test 9 (7:33)
10. Test 10 (7:25)

Mawilo
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Samstag 24. März 2007, 09:01

Hi thorbytes!
Dein Denkfehler liegt in Zeile 5 des Ausgabecodes. Die Schleife läuft über content, und da content nur 3 items hat, ist das Ergebniss halt, das sie nach 3 Runden aufhört.
So müsste es gehen:

Code: Alles auswählen

for times in content['times']:
Gruß, jj
Benutzeravatar
thorbytes
User
Beiträge: 37
Registriert: Samstag 24. Februar 2007, 17:38
Kontaktdaten:

Samstag 24. März 2007, 09:28

Ja, Ihr habt beide recht. Ich dachte, dass die Variable nach dem 'for' (also 'times') automatisch den Dictionary-Eintrag 'times' hernimmt.

Aber ich kann ja genauso gut schreiben:

Code: Alles auswählen

for bla in content['times']:
und es funzt trotzdem.

Ausserdem kann ich die folgende Zeile weglassen:

Code: Alles auswählen

time = content['times'][i-1]
und aus dem 'bla' mach ich noch ein 'time' (also ohne 's' am Ende). Nun sieht meine Schleife so aus:

Code: Alles auswählen

i = 1

for time in content['times']:    
    print "%2d. %s (%d:%02d)" % (i, time['title'], time['minutes'], time['seconds'])
    i+=1
Also, Besten Dank nochmal :)
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Samstag 24. März 2007, 10:05

Hi

Noch ein kleiner Vorschlag, für die durchnummerierung gibts enumerate.

Code: Alles auswählen

for i, time in enumerate(content['times']):   
    print "%2d. %s (%d:%02d)" % (i, time['title'], time['minutes'], time['seconds'])
enumerate gibt dir jeweils den Index und das Item als Tuple zurück (index, item). Mit for i, time packt man direkt die einzelnen Elemente aus dem Tuple aus. Das geht auch in normalen Zuweisungen.

Code: Alles auswählen

erstes_element, zweites_element, drittes_element = (1, 2, 3)
Somit brauchst du dich um i nicht mehr zu kümmern.

Gruss
Benutzeravatar
thorbytes
User
Beiträge: 37
Registriert: Samstag 24. Februar 2007, 17:38
Kontaktdaten:

Samstag 24. März 2007, 10:31

Hallo rayo,

funktioniert gut. Ich muss dann bei der Ausgabe nur noch 'i+1' machen, damit die Ausgabe bei 1. anfängt :D
Antworten