2013-09-02 6 views
12

ネストされた辞書の大きなリストについては、キーが含まれているかどうかを確認したいと思います。 それらのそれぞれは、それらのすべてを通じて、この検索がエラー提起Iループので、もしまたは、ネストされた辞書の1を持っていない可能性があります。入れ子になっている辞書の値をチェックしますか?

for Dict1 in DictionariesList: 
    if "Dict4" in Dict1['Dict2']['Dict3']: 
     print "Yes" 

私のソリューションは、これまでのところです:

for Dict1 in DictionariesList:  
    if "Dict2" in Dict1: 
     if "Dict3" in Dict1['Dict2']: 
      if "Dict4" in Dict1['Dict2']['Dict3']: 
       print "Yes" 

しかし、これは頭​​痛、醜い、おそらくあまりリソー​​スが有効ではありません。 最初の型の方法でこれを行う正しい方法はありますが、辞書が存在しないときにエラーを発生させることはありませんか?デフォルト値として空の辞書と

答えて

39

使用.get()

if 'Dict4' in Dict1.get('Dict2', {}).get('Dict3', {}): 
    print "Yes" 

Dict2キーが空の辞書を返され、存在しないので、次のチェーン.get()Dict3を見つけて、順番に空の辞書を返さない場合。 inテストはFalseを返します。

代替だけでKeyErrorをキャッチすることです:

try: 
    if 'Dict4' in Dict1['Dict2']['Dict3']: 
     print "Yes" 
except KeyError: 
    print "Definitely no" 
+2

驚異的で、テストされ、動作します。非常に感謝しています。早く受け入れます。本当に忍者です。 –

+1

チェーンに 'None'値のキーがあると、最初の提案は失敗します。たとえば、テストは 'Dict1 = {'Dict2':None}'に対しては機能しません。したがって、例外をキャッチすることが最もクリーンな解決策であるようです。 –

+1

@AlexO: '.get()'メソッドを持たないオブジェクトでは失敗します。すべての可能性を説明するのはこのコードの仕事ではありません。明示的に異なる値の型をサポートする必要がある場合を除き、他のバグを示す例外をキャッチしないでください。 –

8

どのようにブロックを除いてのtry /について:ここでは、キーの任意の数の一般化だ

for Dict1 in DictionariesList: 
    try: 
     if 'Dict4' in Dict1['Dict2']['Dict3']: 
      print 'Yes' 
    except KeyError: 
     continue # I just chose to continue. You can do anything here though 
関連する問題