Метод get() для словарей Python: практическое руководство
Метод get() словаря в Python: безопасный доступ к значениям
Метод get() позволяет получить значение словаря по ключу, не вызывая исключение KeyError, если ключ отсутствует. Это основная причина его применения - безопасный и гибкий доступ к данным.
Самый эффективный и рекомендуемый способ - вызов dict.get(key, default=None). Если ключ существует, возвращается его значение; если нет - возвращается default (по умолчанию None).
user = {'name': 'Анна', 'age': 25}
city = user.get('city')
print(city) # Noneсловарь слов python (словарь слов в python)
None
Python значение ключа словаря (значение ключа словаря в python)
Здесь get() не вызывает ошибку, а просто возвращает None, что удобно для дальнейшей обработки.
Как получить значение с подменой по умолчанию при отсутствии ключа?
Часто требуется не None, а какое-то значение по умолчанию. Передаётся второй аргумент:
score = {'математика': 90}
algebra = score.get('алгебра', 0)
print(algebra) # 0
ключ значение в python (пары ключ-значение в python)
0
получить значение ключа python (получение значения ключа в python)
Это удобно для подсчёта статистики, конфигураций и настроек.
Как проверить существование ключа без ошибки, используя get?
Метод get() можно использовать для проверки, но это не самый читаемый способ. Сравнение с None может дать ложный результат, если само значение равно None. В таких случаях лучше применять оператор in.
d = {'a': None}
# Проблемы с проверкой через get
if d.get('a') is None:
print('ключа нет или значение None')
# Для надёжной проверки используют 'in'
if 'a' in d:
print('ключ существует, значение:', d['a'])Python получить ключ (получение ключа словаря в python)
ключа нет или значение None ключ существует, значение: None
словарь значения python (словарь значений в python)
Типичная ошибка: попытка использовать get() для проверки наличия ключа, когда значение может быть None.
config = {'debug': None}
if config.get('debug'):
print('отладка включена') # не сработает, хотя ключ есть
# Решение: использовать 'in' или явное сравнение с None
if 'debug' in config:
print('ключ debug присутствует')список значений словаря python (список значений словаря в python)
ключ debug присутствует
удаление словаря python (удаление элемента из словаря в python)
Ещё одна ошибка: путать get() с обращением по квадратным скобкам и получать KeyError там, где его можно было избежать. Например, при переборе ключей, которых может не быть.
data = {'x': 1}
# Неправильно:
# value = data['y'] # KeyError
# Правильно:
value = data.get('y', 0)Итак, get() - универсальное средство для безопасного чтения из словаря, особенно когда отсутствие ключа не является ошибкой, а лишь поводом использовать значение по умолчанию.
Расширенные примеры использования метода get()
Пример 1. Построение частотного словаря
Подсчёт количества вхождений слов в тексте - классическая задача. Без get() пришлось бы проверять каждый ключ через in.
text = 'яблоко апельсин яблоко банан яблоко апельсин'
words = text.split()
counter = {}
for word in words:
counter[word] = counter.get(word, 0) + 1
print(counter){'яблоко': 3, 'апельсин': 2, 'банан': 1}Пример 2. Вложенные словари с get()
Метод get() можно применять каскадно для безопасного доступа к глубоким уровням.
config = {
'database': {
'host': 'localhost',
'port': 5432
}
}
host = config.get('database', {}).get('host', 'localhost')
print(host) # localhost
port = config.get('database', {}).get('port', 3306)
print(port) # 5432
# Если ключа 'database' нет, {} вернёт default для второго get
bad = config.get('cache', {}).get('type', 'redis')
print(bad) # redislocalhost 5432 redis
Пример 3. Использование get() в словарях со списками
Если значения - списки, удобно добавлять элементы без предварительной проверки.
groups = {}
students = [('A', 'Иван'), ('A', 'Мария'), ('B', 'Петр')]
for group, name in students:
groups[group] = groups.get(group, []) + [name]
print(groups){'A': ['Иван', 'Мария'], 'B': ['Петр']}Альтернатива - setdefault(), которая сразу инициализирует пустой список при отсутствии.
Пример 4. get() с изменяемыми объектами по умолчанию
Значение по умолчанию вычисляется каждый раз при вызове get(), поэтому можно передавать результат вызова функции или конструктора.
import datetime
default_date = datetime.date.today()
extended = {'event': None}
date = extended.get('date', default_date)
print(date) # сегодняшняя дата (вычисляется в момент вызова)2025-04-09
Важно: если нужно, чтобы значение по умолчанию создавалось один раз, лучше предварительно сохранить его в переменную.
Пример 5. get() и классы с кастомными методами
Метод get() существует у всех отображений, включая defaultdict и OrderedDict. В defaultdict get() работает аналогично, но default_factory не вызывается, если ключ отсутствует - возвращается None или переданный default.
from collections import defaultdict
dd = defaultdict(int)
dd['a'] = 1
print(dd.get('b')) # None
print(dd.get('b', 100)) # 100
print(dd['b']) # 0 (создаётся автоматически default_factory)None 100 0
Пример 6. Сравнение производительности get() и try/except
Для случаев, когда ключ почти всегда существует, быстрее может быть прямой доступ с обработкой исключения, но get() предпочтительнее по читаемости.
import timeit
large_dict = {i: i for i in range(1000)}
def use_get():
return large_dict.get(500, 0)
def use_try():
try:
return large_dict[500]
except KeyError:
return 0
print('get:', timeit.timeit(use_get, number=100000))
print('try:', timeit.timeit(use_try, number=100000))get: 0.0045 try: 0.0039
Разница незначительная, выбирают по стилю кода.