Вопрос-Ответ

Why dict.get(key) instead of dict[key]?

Почему dict.get(ключ) вместо dict[ключ]?

Я наткнулся на dict метод get, который, учитывая ключ в словаре, возвращает соответствующее значение.

Для какой цели полезна эта функция? Если бы я хотел найти значение, связанное с ключом, в словаре, я могу просто сделать dict[key], и это вернет то же самое:

dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"] == dictionary.get("Name") # True

Смотрите также: Возвращает значение по умолчанию, если ключ словаря недоступен

Переведено автоматически
Ответ 1

Это позволяет вам указать значение по умолчанию, если ключ отсутствует:

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.


Примером может быть

>>> d = {1:2,2:3}
>>> d[1]
2
>>> d.get(1)
2
>>> d.get(3)
>>> repr(d.get(3))
'None'
>>> d.get(3,1)
1

Есть ли где-нибудь улучшения скорости?


Как упоминалось здесь,


Похоже, что все три подхода теперь демонстрируют схожую производительность (примерно в пределах 10% друг от друга), более или менее независимую от свойств списка слов.


Раньше get было значительно медленнее, однако теперь скорость почти сопоставима наряду с дополнительным преимуществом возврата значения по умолчанию. Но чтобы очистить все наши запросы, мы можем протестировать на довольно большом списке (обратите внимание, что тест включает в себя поиск только всех допустимых ключей)

def getway(d):
for i in range(100):
s = d.get(i)

def lookup(d):
for i in range(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

>>> def lookup(d,val):
... return d[val]
...
>>> def getway(d,val):
... return d.get(val)
...
>>> dis.dis(getway)
2 0 LOAD_FAST 0 (d)
3 LOAD_ATTR 0 (get)
6 LOAD_FAST 1 (val)
9 CALL_FUNCTION 1
12 RETURN_VALUE
>>> dis.dis(lookup)
2 0 LOAD_FAST 0 (d)
3 LOAD_FAST 1 (val)
6 BINARY_SUBSCR
7 RETURN_VALUE

Где это будет полезно?


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

 if key in dic:
val = dic[key]
else:
val = def_val

В одну строку, val = dic.get(key,def_val)


Где это будет бесполезно?


Всякий раз, когда вы хотите вернуть KeyError сообщение о том, что конкретный ключ недоступен. Возврат значения по умолчанию также сопряжен с риском того, что конкретное значение по умолчанию тоже может быть ключом!


Возможно ли иметь get подобную функцию в dict['key']?


Да! Нам нужно реализовать __missing__ в подклассе dict.

Пример программы может быть

class MyDict(dict):
def __missing__(self, key):
return None

Небольшая демонстрация может быть

>>> my_d = MyDict({1:2,2:3})
>>> my_d[1]
2
>>> my_d[3]
>>> repr(my_d[3])
'None'
Ответ 3

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}
assert None is d.get('key', 'alt_value')

.get()второе значение возвращается только в том случае, если предоставленного ключа НЕТ в словаре, а не в том случае, если возвращаемое значение этого вызова None.

2023-04-26 12:46 python dictionary