2016-04-06 8 views
-2

私は多階調の辞書を反復処理し、4つの引数を必要とするssocrを実行する関数をpythonで作成しました:coord、background、foreground、type(それらは私のキーの値です)。 これはjsonファイルから取った私の辞書です。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 

私はiteritems続く2番目の前景のチェックでエラーを持って、私のキー数は、キーのスコアを上書きします

+3

例外は、辞書ではなく文字列で 'iteritems'を呼び出すことです。 –

+0

python 3.xを使用している場合は、 'dic.iteritems'の代わりに' dic.items'を使用してください。 – Arman

+0

@Arman python 2;それは 'ユニコード'と書いてあります –

答えて

1

あなたの問題はここにある:

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

あなたが行っていると思われるチェックは行っていませんやってあなたは効果的(非空の文字列が「truthy」とみなされているため)、常にTrueと評価さ

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

をしようとしています。

だけにその行を変更します。

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

またはそれをあなたが機能(if k != 'players_home' and k != 'players_opponent':)中にさらに行なったし、あなたがビジネスにする必要があり、同じように行います。

+0

かなり恥ずかしいエラー、30分を無駄にし、それに気付かなかった。ありがとう。 – Eldar88

+0

@ Eldar88恥ずかしい必要はありません...私たちすべてに起こります。それでは、あなたのコードにブレークポイントを設定してから、あなたの問題を見つけるために行ごとにステップを進めるために、pdb(またはそれ以上の場合はipdb)を使うことを強くお勧めします。これは、将来何度もあなたを返済するスキルを学ぶための小さな投資です。 – randlet

+0

私はまだ最後のサイクルで鍵を無効にする問題を発見しました – Eldar88