Почему использовать dict.get(key) вместо dict[key]?
У меня возник вопрос по поводу метода get
для объектов dict
в Python, который, получая ключ в словаре, возвращает связанное с ним значение.
Какова полезность этой функции? Если я хочу найти значение, связанное с ключом в словаре, я могу просто использовать dict[key]
, и это вернет то же самое:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"] == dictionary.get("Name") # True
Почему стоит использовать метод get
, если в большинстве случаев достаточно просто обращения к элементу по ключу?
5 ответ(ов)
Метод get
позволяет вам указать значение по умолчанию, если ключ отсутствует в словаре:
dictionary.get("bogus", default_value)
вернёт default_value
(каким бы вы его ни задали), в то время как
dictionary["bogus"]
вызовет ошибку KeyError
.
Если не указать значение по умолчанию, то оно будет равно None
, так что
dictionary.get("bogus") # <-- Значение по умолчанию не указано -- по умолчанию None
вернёт None
, так же как и
dictionary.get("bogus", None)
будет делать.
Метод get
в Python принимает второй необязательный параметр. Если указанный ключ отсутствует в вашем словаре, то будет возвращено это значение.
dictionary = {"Name": "Harry", "Age": 17}
dictionary.get('Year', 'Нет данных')
>> 'Нет данных'
Если вы не передадите второй параметр, то будет возвращено значение None
по умолчанию.
Если же вы используете индексирование, как в dictionary['Year']
, то при отсутствии ключа будет вызвано исключение KeyError
.
Вопрос, на который стоит обратить внимание при использовании метода .get()
:
Если в словаре присутствует ключ, который используется в вызове .get()
, и его значение равно None
, метод .get()
вернет None
, даже если было задано значение по умолчанию.
Например, следующий код вернет None
, а не 'alt_value'
, как можно было бы ожидать:
d = {'key': None}
assert None is d.get('key', 'alt_value')
Следует помнить, что второе значение метода .get()
возвращается только в том случае, если указанный ключ отсутствует в словаре, а не если возвращаемое значение этого вызова уже равно None
.
Я приведу практический пример сбора данных с веб-сайтов с использованием Python. Часто вы столкнетесь с ситуацией, когда ключи словаря не имеют значений. В таких случаях, если вы используете dictionary['key']
, это приведет к ошибке, тогда как dictionary.get('key', 'return_otherwise')
работает без проблем.
Аналогично, я бы использовал ''.join(list)
вместо list[0]
, если вам нужно получить единственное значение из списка.
Надеюсь, это поможет.
[Редактировать] Вот практический пример:
Предположим, вы вызываете API, который возвращает JSON-файл, который вам нужно разобрать. Первый JSON выглядит следующим образом:
{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","submitdate_ts":1318794805,"users_id":"2674360","project_id":"1250499"}}
Второй JSON выглядит так:
{"bids":{"id":16210506,"submitdate":"2011-10-16 15:53:25","submitdate_f":"10\/16\/2011 at 21:53 CEST","submitdate_f2":"p\u0159ed 2 lety","users_id":"2674360","project_id":"1250499"}}
Обратите внимание, что во втором JSON отсутствует ключ "submitdate_ts", что довольно нормально для любой структуры данных.
Таким образом, когда вы пытаетесь получить значение этого ключа в цикле, можно ли использовать следующее:
for item in API_call:
submitdate_ts = item["bids"]["submitdate_ts"]
Вы можете это сделать, но это вызовет ошибку трассировки для второй строки JSON, потому что ключ просто не существует.
Подходящий способ записи этого кода может выглядеть так:
for item in API_call:
submitdate_ts = item.get("bids", {'x': None}).get("submitdate_ts")
{'x': None}
используется для предотвращения ошибки на втором уровне. Конечно, вы можете добавить больше отказоустойчивости в код, если занимаетесь сбором данных. Например, сначала указать условие if.
Цель использования метода get
в словаре заключается в том, чтобы вернуть значение по указанному ключу, а в случае его отсутствия предоставить значение по умолчанию. Это очень удобно, поскольку позволяет избежать ошибки KeyError
, если ключ не найден. В вашем примере:
dictionary.get("Name", 'harry')
если ключ "Name"
отсутствует в словаре dictionary
, метод вернёт 'harry'
, что позволяет избежать необходимости предварительной проверки наличия ключа.
Итерация по словарям с использованием циклов 'for'
Создание словаря (dict) из отдельных списков ключей и значений
Преобразование строки, представляющей словарь, в сам словарь
Преобразование списка словарей в DataFrame pandas
Получить ключ по значению в словаре