Обрабатывать необъявленный ключ dict в Python - PullRequest
16 голосов
/ 20 июля 2011

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

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

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

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

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

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

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

c["not-in-dictionary"]

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

c[:not_in_dictionery] is not None

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

1 Ответ

34 голосов
/ 20 июля 2011

В вашем конкретном случае вам, вероятно, следует сделать это вместо сравнения с 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...