Я наткнулся на dict метод get, который, учитывая ключ в словаре, возвращает соответствующее значение.
Для какой цели полезна эта функция? Если бы я хотел найти значение, связанное с ключом, в словаре, я могу просто сделать dict[key], и это вернет то же самое:
Это позволяет вам указать значение по умолчанию, если ключ отсутствует:
dictionary.get("bogus", default_value)
возвращает default_value (независимо от того, что вы выберете), тогда как
dictionary["bogus"]
вызовет KeyError.
Если опущено, default_value является None таким, что
dictionary.get("bogus") # <-- No default specified -- defaults to None
возвращает None точно так же, как
dictionary.get("bogus", None)
бы.
Ответ 2
Что это за dict.get() метод?
Как уже упоминалось, get метод содержит дополнительный параметр, который указывает на отсутствующее значение. Из документации
get(key[, default])
Возвращает значение для ключа, если ключ находится в словаре, иначе значение по умолчанию. Если значение по умолчанию не задано, по умолчанию оно равно None , так что этот метод никогда не выдает KeyError.
Похоже, что все три подхода теперь демонстрируют схожую производительность (примерно в пределах 10% друг от друга), более или менее независимую от свойств списка слов.
Раньше get было значительно медленнее, однако теперь скорость почти сопоставима наряду с дополнительным преимуществом возврата значения по умолчанию. Но чтобы очистить все наши запросы, мы можем протестировать на довольно большом списке (обратите внимание, что тест включает в себя поиск только всех допустимых ключей)
defgetway(d): for i inrange(100): s = d.get(i)
deflookup(d): for i inrange(100): s = d[i]
Теперь синхронизируем эти две функции с помощью timeit
>>> import timeit >>> print(timeit.timeit("getway({i:i for i in range(100)})","from __main__ import getway")) 20.2124660015 >>> print(timeit.timeit("lookup({i:i for i in range(100)})","from __main__ import lookup")) 16.16223979
Как мы можем видеть, поиск выполняется быстрее, чем get, поскольку нет поиска функции. Это можно увидеть на примере dis
Это будет полезно всякий раз, когда вы захотите указать значение по умолчанию при поиске в словаре. Это сокращает
if key in dic: val = dic[key] else: val = def_val
В одну строку, val = dic.get(key,def_val)
Где это будет бесполезно?
Всякий раз, когда вы хотите вернуть KeyError сообщение о том, что конкретный ключ недоступен. Возврат значения по умолчанию также сопряжен с риском того, что конкретное значение по умолчанию тоже может быть ключом!
Возможно ли иметь get подобную функцию в dict['key']?
Да! Нам нужно реализовать __missing__ в подклассе dict.
get принимает второе необязательное значение. Если указанный ключ не существует в вашем словаре, то будет возвращено это значение.
dictionary = {"Name": "Harry", "Age": 17} dictionary.get('Year', 'No available data') >> 'No available data'
Если вы не укажете второй параметр, None будет возвращен.
Если вы используете индексацию, как в dictionary['Year'], возникнут несуществующие ключи KeyError.
Ответ 4
Ошибка, о которой следует помнить при использовании .get():
Если словарь содержит ключ, использованный при вызове .get() и его значение равно None, .get() метод вернет None даже если указано значение по умолчанию.
Например, следующее возвращает None, а не 'alt_value' как можно было ожидать:
d = {'key': None} assertNoneis d.get('key', 'alt_value')
.get()второе значение возвращается только в том случае, если предоставленного ключа НЕТ в словаре, а не в том случае, если возвращаемое значение этого вызова None.