[英]Return a default value if a dictionary key is not available
我需要一種方法來獲取字典值,如果它的鍵存在,或者簡單地返回None
,如果它不存在。
但是,如果您搜索不存在的鍵,Python 會引發KeyError
異常。 我知道我可以檢查密鑰,但我正在尋找更明確的東西。 如果密鑰不存在,有沒有辦法只返回None
?
您可以使用dict.get()
value = d.get(key)
如果key is not in d
,它將返回None
。 您還可以提供將返回的不同默認值而不是None
:
value = d.get(key, "empty")
不用懷疑了。 它內置在語言中。
>>> help(dict) Help on class dict in module builtins: class dict(object) | dict() -> new empty dictionary | dict(mapping) -> new dictionary initialized from a mapping object's | (key, value) pairs ... | | get(...) | D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. | ...
使用dict.get
如果 key 在字典中,則返回 key 的值,否則返回默認值。 如果未給出默認值,則默認為無,因此此方法永遠不會引發 KeyError。
您應該使用dict
class 中的get()
方法
d = {}
r = d.get('missing_key', None)
這將導致r == None
。 如果在字典中找不到該鍵,則 get function 返回第二個參數。
如果你想要一個更透明的解決方案,你可以繼承dict
來獲得這種行為:
class NoneDict(dict):
def __getitem__(self, key):
return dict.get(self, key)
>>> foo = NoneDict([(1,"asdf"), (2,"qwerty")])
>>> foo[1]
'asdf'
>>> foo[2]
'qwerty'
>>> foo[3] is None
True
我通常在這種情況下使用defaultdict 。 您提供一個工廠方法,它不接受 arguments 並在看到新鍵時創建一個值。 當您想在新鍵上返回空列表之類的內容時,它會更有用( 請參閱示例)。
from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key'] # prints 'None'
單線解決方案是:
item['key'] if 'key' in item else None
這在嘗試將字典值添加到新列表並希望提供默認值時很有用:
例如。
row = [item['key'] if 'key' in item else 'default_value']
正如其他人已經建議的那樣,您可以使用dict
對象的get()
方法。 或者,根據您正在做什么,您可能可以使用這樣的try/except
套件:
try:
<to do something with d[key]>
except KeyError:
<deal with it not being there>
這被認為是處理此案的一種非常“Pythonic”的方法。
正如上面其他人所說,您可以使用 get()。
但是要檢查密鑰,您還可以執行以下操作:
d = {}
if 'keyname' in d:
# d['keyname'] exists
pass
else:
# d['keyname'] does not exist
pass
對於那些對嵌套字典使用dict.get
技術的人,您可以將默認返回值設置為空字典(最外層除外),而不是顯式檢查字典的每一層,或擴展dict
class。 這是一個例子:
my_dict = {'level_1': {
'level_2': {
'level_3': 'more_data'
}
}
}
result = my_dict.get('level_1', {}).get('level_2', {}).get('level_3')
# result -> 'more_data'
none_result = my_dict.get('level_1', {}).get('what_level', {}).get('level_3')
# none_result -> None
警告:請注意,此技術僅在預期鍵的值是字典時才有效。 如果字典中確實存在鍵what_level
但它的值是字符串或 integer 等,那么它會引發AttributeError
。
我對 python2 與 python3 中可能發生的事情感到震驚。 我將根據我最終為 python3 所做的事情來回答它。 我的目標很簡單:檢查字典格式的 json 響應是否出錯。 我的字典被稱為“令牌”,我正在尋找的密鑰是“錯誤”。 我正在尋找關鍵的“錯誤”,如果它不存在將其設置為 None,那么檢查該值是否為 None,如果是,請繼續我的代碼。 如果我確實有鍵“錯誤”,則 else 語句將處理。
if ((token.get('error', None)) is None):
do something
您可以使用 try-except 塊
try:
value = dict['keyname']
except IndexError:
value = None
d1={“一”:1,“二”:2,“三”:3}
d1.get("四")
如果您將運行此代碼,則不會出現“Keyerror”,這意味着您可以使用“dict.get()”來避免錯誤並執行您的代碼
如果您有一個相當於緩存的更復雜的要求,這個 class 可能會派上用場:
class Cache(dict):
""" Provide a dictionary based cache
Pass a function to the constructor that accepts a key and returns
a value. This function will be called exactly once for any key
required of the cache.
"""
def __init__(self, fn):
super()
self._fn = fn
def __getitem__(self, key):
try:
return super().__getitem__(key)
except KeyError:
value = self[key] = self._fn(key)
return value
構造函數采用使用鍵調用的 function 並應返回字典的值。 然后下次從字典中存儲和檢索該值。 像這樣使用它...
def get_from_database(name):
# Do expensive thing to retrieve the value from somewhere
return value
answer = Cache(get_from_database)
x = answer(42) # Gets the value from the database
x = answer(42) # Gets the value directly from the dictionary
您可以通過子類化 dict 來覆蓋__missing__(self, key)
並返回 None。
class MyDict(dict):
def __missing__(self, key):
return None
如果你可以用False
做到這一點,那么還有內置的hasattr功能:
e=dict()
hasattr(e, 'message'):
>>> False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.