2016-04-06 5 views
-2

Ich habe mit Python eine Funktion zum Durchlaufen eines Wörterbuchs mit mehreren Ebenen erstellt, und führen Sie eine zweite Funktion ssocr, die vier Argumente benötigt: koordinieren, Hintergrund, Vordergrund, Typ (sie sind der Wert meiner Schlüssel). Dies ist mein Wörterbuch, das aus einer JSON-Datei stammt.Iteritems ein Diktat in Python

document json

`

def parse_image(self, d): 
    bg = d['background'] 
    fg = d['foreground'] 
    results = {} 
    for k, v in d['boxes'].iteritems(): 
     if 'foreground' in d['boxes']: 
      myfg = d['boxes']['foreground'] 
     else: 
      myfg = fg 
     if k != 'players_home' and k != 'players_opponent': 
      results[k] = MyAgonism.ssocr(v['coord'], bg, myfg, v['type']) 

    results['players_home'] = {} 
    for k, v in d['boxes']['players_home'].iteritems(): 
     if 'foreground' in d['boxes']['players_home']: 
      myfg = d['boxes']['players_home']['foreground'] 
     else: 
      myfg = fg 
     if k != 'background' and 'foreground': 
      for k2, v2 in d['boxes']['players_home'][k].iteritems(): 
       if k2 != 'fouls': 
        results['players_home'][k] = MyAgonism.ssocr(v2['coord'], bg, myfg, v2['type']) 
    return results 

ich einen Fehler im Vordergrund Prüfung in der zweiten haben iteritems dauern, meine Schlüsselnummer überschreibt die Schlüssel Punktzahl

+3

Die Ausnahme sagt es: Sie rufen 'Iteritems' auf einer Zeichenfolge, kein Wörterbuch. –

+0

Wenn Sie Python 3.x verwenden, sollten Sie 'dic.items' statt' dic.iteritems' verwenden – Arman

+0

@Arman python 2; es heißt 'unicode' –

Antwort

1

Ihr Problem ist hier:

if k != 'background' and 'foreground': 
    # do something 

Was macht die Überprüfung nicht Sie denken, es ist tun. Sie versuchen, effektiv

if (k != "background") and ('foreground'): 
    # do something 

die immer True auswertet (da eine nicht leere Zeichenfolge betrachtet wird „truthy“).

Ändern Sie einfach diese Zeile:

if k not in ('background', 'foreground'): 
    # do stuff 

oder es tun die gleiche Weise weiter tat bis in die Funktion (if k != 'players_home' and k != 'players_opponent':) und Sie sollten im Geschäft.

+0

Ziemlich peinlich Fehler, verschwendete eine halbe Stunde und bemerkte es nicht. Vielen Dank. – Eldar88

+0

@ Eldar88 keine Notwendigkeit, sich zu schämen ... passiert uns allen. Das heißt, ich empfehle dringend, pdb (oder besser ipdb) zu verwenden, um einen Unterbrechungspunkt in Ihrem Code festzulegen und dann Zeile für Zeile durchzulaufen, um Ihr Problem zu finden. Es ist eine kleine Investition, um eine Fähigkeit zu erlernen, die Sie in der Zukunft viele Male zurückzahlen wird. – randlet

+0

Ich fand immer noch ein Problem mit dem Überschreiben von Schlüssel Ich denke, im letzten Zyklus – Eldar88

Verwandte Themen