簡體   English   中英

如果字典鍵不可用,則返回默認值

[英]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
  1. d1={“一”:1,“二”:2,“三”:3}

  2. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM