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

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

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

Ответ 1

Вы можете использовать dict.get()

value = d.get(key)

который вернет None, если key is not in d. Вы также можете указать другое значение по умолчанию, которое будет возвращено вместо None:

value = d.get(key, "empty")

Ответ 2

Не удивляйся. Он встроен в язык.

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

Ответ 3

Используйте dict.get

Ответ 4

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

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

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

Ответ 5

Если вы хотите более прозрачное решение, вы можете подклассифицировать 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

Ответ 6

Я обычно использую defaultdict для подобных ситуаций. Вы предоставляете фабричный метод, который не принимает аргументов и создает значение, когда он видит новый ключ. Это более полезно, когда вы хотите вернуть что-то вроде пустого списка новых ключей (см. Примеры).

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

Ответ 7

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

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

Это считается очень "питоновским" подходом к рассмотрению дела.

Ответ 8

Однострочное решение будет:

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

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

например.

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

Ответ 9

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

Но для проверки ключа вы также можете:

d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass

Ответ 10

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

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

Ответ 11

Вы можете переопределить __missing__(self, key) подклассификацию dict и __missing__(self, key) None.

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