2012-02-14 67 views
26

在Python什麼是做到這一點的最有效的方式返回None:訪問字典鍵,如果不存在

my_var = some_var['my_key'] | None 

即。如果some_var包含'my_key',則將some_var['my_key']分配給my_var,否則將my_var設爲None

+1

你是什麼意思「如果它存在」?在某些情況下,可能會定義'some_var'這個名字? – 2012-02-14 22:22:08

+1

我剛剛編輯它 - 澄清 - 我試圖檢查在字典中的一個關鍵的存在本質上 – 2012-02-14 22:24:45

+0

我敢打賭,這已被問...... – 2012-02-14 22:27:44

回答

37

Python會拋出一個KeyError如果密鑰在字典中不存在,那麼您不能以與JavaScript相同的方式編寫代碼。但是,如果您正在使用與您的示例中的字典專用的操作,則有一個非常好的功能mydict.get('key', default),它試圖從字典中獲取密鑰,並在密鑰不存在時返回默認值。

如果您只是想默認爲None,則不需要顯式傳遞第二個參數。

根據您的字典包含的內容以及期望訪問未設置密鑰的頻率,您可能還有興趣使用collections包中的defaultdict。這需要一個工廠,並使用它來從__missing__魔法方法返回新值,只要您訪問沒有明確設置的密鑰。如果您的字典只包含一種類型,它特別有用。

from collections import defaultdict 

foo = defaultdict(list) 
bar = foo["unset"] 
# bar is now a new empty list 

N.B.該文檔(對於2.7.13)聲稱,如果您沒有將參數傳遞給defaultdict,它將爲未設置的密鑰返回None。當我嘗試它時(在2.7.10上,這正是我碰巧安裝的),沒有奏效,我收到了KeyError。因人而異。或者,您可以使用lambda:defaultdict(lambda: None)

+2

**當您訪問字典中不存在的密鑰時,將引發KeyError **。 – farthVader 2014-12-19 09:31:38

2
try: 
    my_var = some_var 
except: 
    my_var = None 

不過說實話這可能不會得到你正在試圖做什麼的心臟......我們需要更多方面更充分地回答。

+0

我只是添加了一個說明 - some_var實際上是一個字典,我想確保密鑰存在於其中否則使用無 – 2012-02-14 22:25:27

1

在python「|」被翻譯成 「或」,所以:

my_var = some_var或無

編輯: 編輯完你的初始後。做你想做什麼正確的方法是:

my_var = some_var.get('my_key', None) 
+0

無是無用的,默認爲無 - > http ://docs.python.org/library/stdtypes.html#typesmapping – Fred 2012-02-14 22:44:33

+0

這只是一個例子來說明使用dict.get。 – 2012-02-15 16:59:27

17

您正在尋找的dictget()方法。

my_var = some_var.get('some_key') 

get()方法將返回與'some_key'相關聯的值,如果這樣的值存在。如果密鑰不存在,則返回None

7

假設some_var是一本字典,你需要dict.get()

my_var = some_var.get('my_key') 

這一結果默認爲None,如果my_key丟失,但是您可以提供不同的默認:

my_var = some_var.get('my_key', default) 
6

.get()方法的優點是您可以實際定義要返回的值,以防鑰匙不存在。

my_dict = { 1: 'one', 2: 'two' } 
print my_dict.get(3, 'Undefined key') 

會打印。

Undefined key 

這不僅是爲了調試的目的,同時也解析JSON時(以我的經驗,至少)非常有幫助,你應該更喜歡使用get()超過[]儘可能。