Обрабатывать необъявленную клавишу dict в Python

В моем приложении Ruby у меня есть хеш-таблица:

c = {:sample => 1,:another => 2}

Я могу обрабатывать таблицу следующим образом:

[c[:sample].nil? , c[:another].nil? ,c[:not_in_list].nil?]

Я пытаюсь сделать то же самое в Python. Я создал новый словарь:

c = {"sample":1, "another":2}

Я не мог обработать исключение значения nil для:

c["not-in-dictionary"]

Я пробовал это:

c[:not_in_dictionery] is not None

и он возвращает исключение вместо False. Как это сделать?

Ответ 1

В вашем конкретном случае вы должны, вероятно, сделать это вместо сравнения с None:

"not_in_dictionary" in c

Если вы буквально использовали этот код, это не сработает:

c[:not_in_dictionary] is not None

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


Обычное поведение в Python заключается в том, чтобы вызвать исключение, когда вы запрашиваете отсутствующий ключ, и позволяете обрабатывать исключение.

d = {"a": 2, "c": 3}

try:
    print d["b"]
except KeyError:
    print "There is no b in our dict!"

Если вы хотите получить None, если значение отсутствует, вы можете использовать метод dict .get для возврата значения (None по умолчанию), если ключ отсутствует.

print d.get("a") # prints 2
print d.get("b") # prints None
print d.get("b", 0) # prints 0

Чтобы проверить, имеет ли ключ значение в dict, используйте ключевые слова in или not in.

print "a" in d # True
print "b" in d # False
print "c" not in d # False
print "d" not in d # True

Python включает в себя модуль, который позволяет вам определять словари, которые возвращают значение по умолчанию вместо ошибки при обычном использовании: collections.defaultdict. Вы можете использовать его следующим образом:

import collections

d = collections.defaultdict(lambda: None)
print "b" in d # False
print d["b"] # None
print d["b"] == None # True
print "b" in d # True

Обратите внимание на запутанное поведение с помощью in. Когда вы просматриваете ключ в первый раз, он добавляет его, указывая на значение по умолчанию, поэтому теперь он считается in dict.