2016-08-24 3 views
-1

Python dictsで奇妙なキーエラーが発生しました。私の鍵は "B19013_001E"で、私はdict "sf_tracts"にネストされたdict "properties"という名前を付けました。ここに私のコードです。これによりPythonキーエラー(_

x = "B19013_001E" 
for tract in sf_tracts: 
    print tract["properties"][x] 

、私はKeyError例外を取得:私はこれにコードを変更した場合、 "B19013_001E" しかし

を、値が印刷されます:

x = "B19013_001E" 
for tract in sf_tracts: 
    for key in tract["properties"]: 
     if key == "B19013_001E": 
      print tract["properties"][x] 

何ですか差?

-edit- 他のキーを印刷できるので、問題はアンダースコアです。このキーにはどのようにアクセスすればよいですか?

おかげ

+1

正確に 'sf_tracts'にあるもの – depperm

+1

文字列にアンダースコアは何も特別なものはありません。 'print list(tract ['properties'])'は何を生成しますか?その1つのキーの正確な引用表現を共有できますか? –

+6

あなたは '** sf_tracts'に複数の**辞書を持っています。 *すべての辞書にはそのキーがありません。あなたの 'for key in dictionary'ループは' tract ["properties"]:print tract ["properties"] [x] 'に置き換えることができます。 –

答えて

3

あなたは鍵がtract in sf_tractsループが生成すべて辞書に存在すると仮定されています。その前提は間違っています。

あなたの本質的にキーが存在するかどうかをテストしているので、2番目のコードがうまく動作します。あなたが使用することができ

for tract in sf_tracts: 
    if x in tract["properties"]: 
     print tract["properties"][x] 

か::

for tract in sf_tracts: 
    print tract["properties"].get(x, 'Key is not present') 

値に下線を持つ文字列のキーは特別なものは何もそれ以外の場合はありませんあなたは代わりにこれを行うことができます。アンダースコアは、そのようなキーがどのように扱われるかに違いはありません。

1

あなたの領域の中には、その特定のキーがないものがあります。最初のケースでは、すべての領域にキーを印刷するように要求していますが、2番目の場合は、印刷操作をキーを持つものだけに制限しています。