Вернуть None, если ключ словаря недоступен - PullRequest
403 голосов
/ 26 мая 2011

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

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

Ответы [ 11 ]

674 голосов
/ 26 мая 2011

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

value = d.get(key)

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

value = d.get(key, "empty")
60 голосов
/ 26 мая 2011

Чудо не более. Он встроен в язык.

    >>> 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.
     |  
    ...
23 голосов
/ 26 мая 2011

Использование dict.get

18 голосов
/ 26 мая 2011

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

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

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

17 голосов
/ 26 мая 2011

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

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

from collections import defaultdict
d = defaultdict(lambda: None)
print d['new_key']  # prints 'None'
7 голосов
/ 26 мая 2011

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

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

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

4 голосов
/ 29 мая 2018

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

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

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

например.

row = [item['key'] if 'key' in item else 'default_value']
4 голосов
/ 26 мая 2011

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

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

d = {}
if 'keyname' in d:

    # d['keyname'] exists
    pass

else:

    # d['keyname'] does not exist
    pass
0 голосов
/ 18 мая 2017

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

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