Возвращает None, если ключ словаря недоступен



Мне нужен способ получить значение словаря, если его ключ существует, или просто вернуть None, если это не так.



однако Python возвращает key_error, если вы ищете ключ, который не существует. Я знаю, что могу проверить ключ, но я ищу что-то более явное. Есть ли способ просто вернуть None, если ключ не существует ?

209   11  

11 ответов:

можно использовать get()

value = d.get(key)

что вернет None Если key is not in d. Вы также можете указать другое значение по умолчанию, которое будет возвращено вместо 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

вы должны использовать get() метод dict класс

d = {}
r = d.get( 'missing_key', None )

в результате r == None. Если ключ не найден в словаре, функция get возвращает второй аргумент.

Если вы хотите более прозрачное решение, вы можете подкласс 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 для таких ситуаций. Вы предоставляете метод фабрики, который не принимает аргументов и создает значение, когда он видит новый ключ. Это более полезно, когда вы хотите вернуть что-то вроде пустого списка на новые ключи (примеры).

from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key']  # prints 'None'

Как уже говорили выше, вы можете использовать get().

но чтобы проверить ключ, вы также можете сделать:

d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass

вы могли бы использовать dict объекта get() метод, как уже предлагали другие. Кроме того, в зависимости от того, что именно вы делаете, вы можете использовать try/except люкс вроде этого:

try:
   <to do something with d[key]>
except KeyError:
   <deal with it not being there>

, который считается очень "весть" подхода к делу.

решение в одну строку будет:

item['key'] if 'key' in item else None

это полезно при попытке добавить значения словаря в новый список и хотите предоставить значение по умолчанию:

например.

row = [item['key'] if 'key' in item else 'default_value']

Если вы можете сделать это с помощью False, значит, есть и hasattr встроенная функция:

e=dict()
hasattr(e, 'message'):
>>> False

можно переопределить __missing__(self, key) на подклассы dict и возврата нет.

class MyDict(dict):
    def __missing__(self, key):
        return None

Comments

    Ничего не найдено.