Сегодня я наткнулся на dict
метод, get
который, учитывая ключ в словаре, возвращает соответствующее значение.
Для чего эта функция полезна? Если я хочу найти значение, связанное с ключом в словаре, я могу просто сделать dict[key]
, и он возвращает то же самое:
dictionary = {"Name": "Harry", "Age": 17}
dictionary["Name"]
dictionary.get("Name")
python
dictionary
stensootla
источник
источник
dictionary["foo"]
иdictionary.get("foo")
вести себя по-другому, хотя.dictionary.get("Age")
такой же , как писать ,dictionary["Age"] or None
так что неявно обрабатывает KeyError исключениеdictionary['non-existent key'] or None
должен и все же поднимаетKeyError
для меня (до v3.6). Можете ли вы объяснить, что вы имеете в виду?Ответы:
Это позволяет вам указать значение по умолчанию, если ключ отсутствует:
возвращает
default_value
(что бы вы ни выбрали), тогда какподнимет
KeyError
.Если опущено,
default_value
естьNone
такое, чтовозвращается так
None
же, какбыло бы.
источник
dictionary.get("bogus") or my_default
? Я видел, как люди используют его в некоторых случаях, и мне было интересно, есть ли какое-то преимущество в использовании одного вместо другого (кроме читабельности)"bogus"
является ключомdictionary
иdictionary.get("bogus")
возвращает значение, которое оценивается как False в логическом контексте (т. Е. Значение Falsey), такое как 0 или пустая строка''
, тогдаdictionary.get("bogus") or my_default
будет оцениваться,my_default
тогда какdictionary.get("bogus", my_default)
будет возвращено значение Falsey. Так что нет,dictionary.get("bogus") or my_default
не эквивалентноdictionary.get("bogus", my_default)
. Какой из них использовать, зависит от желаемого вами поведения.x = {'a':0}
. Затемx.get('a', 'foo')
возвращается,0
ноx.get('a') or 'foo'
возвращается'foo'
.dictionary.get('key')
: это может сбивать с толку, если значения в словареNone
. Без указания возвращаемого значения (второй необязательный аргумент) невозможно проверить, не существует ли ключ или его значениеNone
. В этом конкретном случае я хотел бы рассмотреть возможность использованияtry-except-KeyError
.Как уже упоминалось,
get
метод содержит дополнительный параметр, который указывает пропущенное значение. Из документацииПримером может быть
Как уже упоминалось здесь ,
Ранее
get
было значительно медленнее, однако теперь скорость почти сопоставима с дополнительным преимуществом возврата значения по умолчанию. Но чтобы очистить все наши запросы, мы можем протестировать довольно большой список (обратите внимание, что тест включает в себя поиск только всех допустимых ключей)Теперь синхронизируем эти две функции, используя
timeit
Как мы видим, поиск выполняется быстрее, чем поиск, так как поиск функции отсутствует. Это можно увидеть через
dis
Это будет полезно всякий раз, когда вы хотите указать значение по умолчанию при поиске в словаре. Это уменьшает
Для одной строки,
val = dic.get(key,def_val)
Всякий раз, когда вы хотите вернуть сообщение о
KeyError
том, что конкретный ключ недоступен. Возвращение значения по умолчанию также несет в себе риск того, что определенное значение по умолчанию также может быть ключевым!Да! Нам нужно реализовать
__missing__
в подклассе dict.Пример программы может быть
Небольшая демонстрация может быть
источник
if k in dict and dict[k]:
противif dict.get(k):
. Это касается ситуации , когда нам нужно проверить , если ключ существует, и если «да» - то , что значение ?, что - то вроде:dict = {1: '', 2: 'some value'}
.dictionary.get(value, long_function())
одного можно подумать об использованииdictionary.get(value) or long_function()
get
принимает второе необязательное значение. Если указанный ключ не существует в вашем словаре, то это значение будет возвращено.Если вы не дадите второй параметр,
None
будет возвращено.Если вы используете индексирование как в
dictionary['Year']
, несуществующие ключи будут повышатьсяKeyError
.источник
Я приведу практический пример очистки веб-данных с помощью python, во многих случаях вы будете получать ключи без значений, в этих случаях вы будете получать ошибки, если будете использовать словарь ['key'], тогда как dictionary.get ('key ',' return_otherwise ') не имеет проблем.
Точно так же, я бы использовал '' .join (list) вместо list [0], если вы попытаетесь захватить одно значение из списка.
Надеюсь, поможет.
[Править] Вот практический пример:
Скажем, вы вызываете API, который возвращает файл JOSN, который вам нужно проанализировать. Первый JSON выглядит следующим образом:
Второй JOSN выглядит так:
Обратите внимание, что во втором JSON отсутствует ключ submitdate_ts, что вполне нормально для любой структуры данных.
Поэтому, когда вы пытаетесь получить доступ к значению этого ключа в цикле, вы можете вызвать его с помощью следующего:
Вы могли бы, но это даст вам ошибку отслеживания для второй строки JSON, потому что ключ просто не существует.
Подходящим способом кодирования этого может быть следующее:
{'x': Нет}, чтобы избежать получения ошибки на втором уровне. Конечно, вы можете повысить отказоустойчивость в коде, если выполняете очистку. Как сначала указать условие if
источник
Цель состоит в том, чтобы вы могли дать значение по умолчанию, если ключ не найден, что очень полезно
источник
Нужно быть в курсе при использовании
.get()
:Если словарь содержит ключ, используемый в вызове,
.get()
и его значение равноNone
,.get()
метод вернется,None
даже если указано значение по умолчанию.Например, следующие результаты
None
не'alt_value'
соответствуют ожидаемым:.get()
Второе значение возвращается только в том случае, если предоставленный ключ НЕ находится в словаре, а не если возвращаемое значение этого вызоваNone
.источник
d.get('key') or 'alt_value'
если вы знаете, что это может бытьNone
Одно конкретное использование подсчета со словарем. Предположим, вы хотите посчитать количество вхождений каждого элемента в данном списке. Обычный способ сделать это - создать словарь, в котором ключи - это элементы, а значения - это число вхождений.
Используя
.get()
метод, вы можете сделать этот код более компактным и понятным:источник
0. Резюме
По сравнению с
dict[key]
,dict.get
обеспечивает запасное значение при поиске ключа.1. Определение
get (key [, default]) 4. Встроенные типы - документация по Python 3.6.4rc1
Возвращает значение для ключа, если ключ находится в словаре, иначе по умолчанию. Если default не задано, по умолчанию используется None, поэтому этот метод никогда не вызывает KeyError.
2. Проблема это решает.
Если нет
default value
, вы должны написать громоздкие коды для обработки такого исключения.В качестве удобного решения
dict.get
вводится необязательное значение по умолчанию, позволяющее избежать использования незакрепленных кодов.3. Вывод
dict.get
имеет дополнительную опцию значения по умолчанию для исключения, если ключ отсутствует в словареисточник
Одно из отличий, которое может быть преимуществом, состоит в том, что если мы ищем ключ, который не существует, мы получим None, не так, как при использовании обозначения в скобках, в этом случае мы получим ошибку:
Последняя вещь, которая хороша в методе get, это то, что он получает дополнительный необязательный аргумент для значения по умолчанию, то есть, если мы пытались получить значение оценки учащегося, но у учащегося нет ключа оценки, который мы можем получить 0 вместо.
Поэтому вместо того, чтобы делать это (или что-то подобное):
Мы можем сделать это:
источник
В зависимости от использования следует использовать это
get
метод.Example1
Example2
источник