2010-02-15 90 views
22

我對Python和解析數據很新。從Python中讀取字典如果密鑰可能不存在

我可以將外部JSON訂閱源拖入Python字典並遍歷字典。

for r in results: 
    print r['key_name'] 

當我走過返回的結果,我得到某個鍵不具有值的誤差(價值可能並不總是存在的記錄)。如果我打印結果,它顯示爲

'key_name': None, 'next_key':................. 

我的代碼中斷了錯誤。我怎樣才能控制一個沒有價值的鑰匙?

任何幫助將不勝感激!

布洛克

回答

66

的首選方法,當適用:

for r in results: 
    print r.get('key_name') 

這會簡單地打印None如果key_name不是關鍵在字典裏。你也可以有不同的默認值,只是把它作爲第二個參數:

for r in results: 
    print r.get('key_name', 'Missing: key_name') 

如果你想要做的事比使用默認值不同(比如,跳過打印完全時,關鍵是不存在的),那麼你需要多一點的結構,即,無論是:

for r in results: 
    if 'key_name' in r: 
     print r['key_name'] 

for r in results: 
    try: print r['key_name'] 
    except KeyError: pass 

第二個可以更快(如果它是合理的罕見比密鑰丟失),但網絡連接第一個對許多人來說似乎更自然。

+0

有沒有辦法獲得某個密鑰的子密鑰? – brizz 2015-03-24 23:16:32

+0

@brizz,什麼是「子密鑰」? – 2015-03-25 01:48:32

+1

說你有一個詞典{data:{'moredata':'value','evenmoredata':'anothervalue'}},.get適用於.get('data'),但是無論如何要訪問.get 'data')['moredata'] – brizz 2015-03-25 02:47:01

0

使用對象的has_key(),這將返回true或false

+7

'd.has_key(K)'是現已棄用。你應該在新代碼中使用'k'in d'。 – LeafStorm 2010-02-15 02:37:16

0

[更新,刪除了紕漏]

你也可以做這樣的事情:

for r in (row for row in results if 'a' in row): 
    print r['a'] 

這將使用生成器表達式來接「行」出「成果」,其中「行」包括關鍵「a」。

這裏有一個小測試腳本:

results = [{'a':True}, {'b':True}, {'a':True}] 
for r in (row for row in results if 'a' in row): print r['a'] 
+0

'[r.get('key_name')for r' – bernie 2010-02-15 03:29:01

+0

@Parand:你測試了什麼版本的Python?你的'for'語句在Python 2.6和3.1中繪製** SYNTAX ** ** ERROR **。 – 2010-02-15 03:53:35

+0

對不起約翰,那是一個粗心的錯誤。修復了腳本,現在應該在python 2.5+上運行。 – Parand 2010-02-15 06:06:23

1

如果可能的話,使用simplejson庫管理JSON數據。

0

如果密鑰可能不存在,有兩種直接讀取Python dict的方法。例如:

dicty = {'A': 'hello', 'B': 'world'}

  1. 的Python的方式訪問一個鍵 - 值對是:

value = dicty.get('C', 'default value')

  • 非Python化方式:
  • value = dicty['C'] if dicty['C'] else 'default value'

  • 更糟:
  • try: value = dicty['C'] except KeyError as ke: value = 'default value'

    0

    可以使用內置函數hasattr

    key='key_name' 
    # or loop your keys 
    
    if hasattr(e, key): 
        print(e[key]) 
    else: 
        print('No key for %s' % key)