2016-10-03 15 views
0

Ich habeseltsame Fehler in Schleifen

DIKT
{ 
    "count_casinos": 4, 
    "casinos": { 
     "16": { 
      "fields": [ 
       {"casino_logo": "assets/images/crown.png"}, 
       {"raiting_casino": "9"}, 
       {"bonus_code": "AX7772"}, 
       {"bonus_summa": "200"}, 
       {"bonus_min_depozit": "1000000"}, 
       {"bonus_veizdjer": "4"}], 
      "title": "Royal casino casino1"}, 
     "17": { 
      "fields": [ 
       {"casino_logo": "assets/images/crown.png"}, 
       {"raiting_casino": "8.2"}, 
       {"bonus_code": "AX777"}, 
       {"bonus_summa": "200"}, 
       {"bonus_min_depozit": "1000000"}, 
       {"bonus_veizdjer": "4"}], 
      "title": "Royal casino casino3"}, 
     "18": { 
      "fields": [ 
       {"casino_logo": "assets/images/crown.png"}, 
       {"raiting_casino": "9.3"}, 
       {"bonus_code": "AX7772"}, 
       {"bonus_summa": "200"}, 
       {"bonus_min_depozit": "1000000"}, 
       {"bonus_veizdjer": "4"}], 
      "title": "Royal casino casino2"}, 
     "15": { 
      "fields": [ 
       {"casino_logo": "assets/images/crown.png"}, 
       {"raiting_casino": "9.9"}, 
       {"bonus_code": "AX777"}, 
       {"bonus_summa": "200"}, 
       {"bonus_min_depozit": "1000000"}, 
       {"bonus_veizdjer": "4"}], 
      "title": "Royal casino casino4"}}} 

, wenn ich versuche Schleife

 for k,v in casino.iteritems(): 
     for iterm in v['fields']: 
      print iterm['bonus_code'] 

key:error

, was falsch ist?

+0

Ist 'Casino' ein Diktat mit bereitgestellten Daten? –

+0

@Aaron das Problem ist nicht, dass der Schlüssel nicht existiert. OP kommt einfach nicht weit genug in das verschachtelte Wörterbuch, um darauf zuzugreifen. – roganjosh

+0

Sie gehen nicht tief genug, 'für k, v in casino.iteritems():' wird nur einmal durchlaufen, für die '16' Taste. – Efferalgan

Antwort

1

Wenn Sie durch v['fields'] iterieren wird jeder Artikel dict Objekt mit nur einem Schlüssel, und nur ein Element 'bonus_code' Schlüssel haben.

leichte Veränderung, die Sie nicht einen Fehler

for k,v in casino.iteritems(): 
    for iterm in v['fields']: 
     if 'bonus_code' in iterm: print iterm['bonus_code'] 

Hinweis erhalten: wenn casino ist initial_data dict .get('casinos')

UPDATE

ich eine Vermutung gemacht, dass casino der OP Variable

data = {"count_casinos": 4, "casinos": {"16": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "9"}, {"bonus_code": "AX7772"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino1"}, "17": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "8.2"}, {"bonus_code": "AX777"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino3"}, "18": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "9.3"}, {"bonus_code": "AX7772"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino2"}, "15": {"fields": [{"casino_logo": "assets/images/crown.png"}, {"raiting_casino": "9.9"}, {"bonus_code": "AX777"}, {"bonus_summa": "200"}, {"bonus_min_depozit": "1000000"}, {"bonus_veizdjer": "4"}], "title": "Royal casino casino4"}}} 
casino = data.get('casinos') 

denn wenn casino wäre anfängliche dict die OP präsentiert, dann wird OP eine andere Fehlermeldung erhalten (TypeError), da die Werte von data['count_casinos'] ist int und int haben keine __getitem__ Methode die TypeError erhöhen würde.

+1

Hast du das getestet? 'TypeError: 'int' Objekt hat kein Attribut '__getitem__' ' – roganjosh

+0

@roganjosh Ich habe eine Notiz am Ende der Antwort hinzugefügt. Da 'casino' höchstwahrscheinlich den Wert der Anfangsdaten dict mit dem Schlüssel '' casinos' 'hat, würde OP stattdessen' TypeError' erhalten. –

+0

und was ist mit anderen Schlüsseln? –

0

Sie gingen nicht tief genug in die verschachtelten Wörterbücher. Wenn Sie nur an der casinos Datensektion interessiert sind, würde so etwas für Sie arbeiten.

for k,v in casino['casinos'].iteritems(): 
    data_list = v.get('fields') 

    # If you know the list index is consistent 
    print data_list[2].get('bonus_code') 

    #otherwise 
    for item in data_list: 
     if 'bonus_code' in item.keys(): 
      print item['bonus_code'] 
+0

und was ist mit anderen Schlüsseln? –

+0

@VladleeleeLee Ich weiß nicht, was Sie mich fragen. Mein Code vervollständigt die Aufgabe in Ihrer Frage. Wenn Sie etwas ähnliches für andere Schlüssel tun möchten, dann müssen Sie nur Änderungen an der Struktur meiner Antwort vornehmen, um sie an Ihre Bedürfnisse anzupassen. – roganjosh