Обрабатывать необъявленный ключ 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 ' s .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 the dict.