2016-05-18 4 views
1

次のテストデータでは、キー 'x'の値をリストlsに追加しようとしています。私の質問は、データの最初の行をループするときに私がKeyErrorを取得しなかった理由です。明らかに、最初の行にはキー 'x'が含まれていません。もともと私はTry/Exceptを使用してデータをループする際にエラーを避けなければならないと考えましたが、Try/Exceptは必要ないと思われます。なぜキーが存在しないときにKeyErrorを取得できませんでしたか?

ここでKeyErrorが生成されないのはなぜですか?

data = [{u'xyz': []}, 
     {u'xyz': [{u'x' : 2, 
        u'y' : 3, 
        u'z' : 4}]}] 

ls = [] 

for item in data: 
    ddd = item['xyz'] 
    print ddd 

    for d in ddd: 
     ls.append(d['x']) 

ls 

出力:

[] 
[{u'y': 3, u'x': 2, u'z': 4}] 

[2] 

答えて

2

何をループは実行されません:

>>> for item in []: 
...  print item 
... 
>>> 

をそう

data = [{u'xyz': []}, 
      ...  ] 


# first time through 
for item in data: 
    ddd = item['xyz'] 

    # ddd is an empty list 

    for d in ddd: 
     # this doesn't run, therefore no KeyError 
     ls.append(d['x']) 

したい場合に必要とされる場合を除き/お試しくださいt O キャッチ KeyError例外は、あなたがする場合は避ける 1することができますいずれかを実行します。

if 'x' in d: # test if 'x' is a key in d 

or 

d.get('x') # returns the value, or None 
0

最初の行が空のリストで、それには辞書がありませんので、何KeyErrorをありません。したがって、ループ:

for d in ddd: 

が入力されていません。最初の行を変更してみてください。期待通り

data = [{u'xyz': [{}]}, 

あなたはKeyErrorを見るでしょう。

関連する問題