2015-06-11 103 views
5

用戶詢問(Keyerror while using pandas in PYTHON 2.7)爲什麼他在查看詞典時遇到了KeyError以及他如何避免此異常。我正確使用`all`嗎?

作爲一個答案,我建議他檢查字典之前的密鑰。所以,如果他需要的所有鍵['key_a', 'key_b', 'key_c']dictionary,他可以測試它:

if not all([x in dictionary for x in ['key_a', 'key_b', 'key_c']]): 
    continue 

這樣,他可以無視那些沒有預期的按鍵詞典(被創造出來的JSON的詞典列表從文件加載格式化的行)。 * 如果與此問題相關,請參閱原始問題以獲取更多詳細信息。

一位在Python和SO方面更有經驗的用戶,我認爲這是一個關於其職業和金牌的權威機構,他告訴我我錯誤地使用了all。我想知道這是否真的如此(因爲我能說的是,那是按預期工作的)以及爲什麼,或者如果有更好的方法來檢查幾個鍵是否都在字典中。

+1

正如你在這裏的問題一樣,但如果你在試圖獲得它的值之前關心一個關鍵字是否在字典中,你總是可以調用字典上的'get()'方法。因此,'dict.get('key',None)'將返回'key'或'None'的值,其中'dict ['key']'可能導致KeyError。 – Jkdc

回答

13

是的,這將正常工作,但你甚至不需要列表理解

if not all(x in dictionary for x in ['key_a', 'key_b', 'key_c']): 
    continue 

如果你周圍[],它會調用all之前的所有元素評價。如果刪除它們,內部表達式就是一個生成器,並且會在第一個False之後short-circuit

+0

@MartijnPieters一如既往,你是對的,先生。 –

+3

'should_we = lambda:False#例如NO'和'destroy_world = lambda:「喚出克蘇魯,吃世界」,然後'如果全部(f()for f in(should_we,destroy_world)):print(「我們還在嗎?」)''不會摧毀世界。 –

+0

@MartijnPieters問題在於,克蘇魯可以及時旅行,也可以在發電機表達順序中旅行,所以他可能會首先被稱爲不幸的:P – CoryKramer