Найти в Дзене
Машинное обучение

Эффективное программирование с помощью defaultdict() Python

Оглавление

В этой небольшой статье я хочу показать вам функцию, которая сделает ваш процесс разработки на Python более эффективным!

Я покажу вам, что такое defaultdict() и в чем разница между dict() и defaultdict() на примерах.

dict() и defaultdict()

Defaultdict — это хранилище данных, подобный словарям, который находится в модуле collections. Defaultdict — это подкласс словаря, который возвращает объект, подобный словарю. Функциональность как словарей, так и defaultdict почти одинакова, за исключением того факта, что defaultdict никогда не вызывает KeyError. Он возвращает значение по умолчанию для несуществующего ключа.

Синтаксис: defaultdict(default_factory)

Параметры:

default_factory: функция, возвращающая значение по умолчанию для определенного словаря. Если этот аргумент отсутствует, словарь выдает ошибку KeyError.

Как вы знаете, если попытаться вернуть значение из словаря по ключю которого нет, вы получите KeyError.

certificates = {}
students = [“Michael”, “George”, “Jesica”]
grades = [
{“History”: 50, “Mathematics”: 90, “Physics”: 70},
{“History”: 70, “Mathematics”: 85, “Physics”: 30},
{“History”: 60, “Mathematics”: 50, “Physics”: 60}
]for index, value in enumerate(grades):
certificates[students[index]].append(value)
>>> KeyError: ‘Michael’

Чтобы избежать ошибки, вы можете добавить оператор «if» в код :

for index, value in enumerate(grades):
if students[index] not in certificates:
certificates[students[index]] = []
certificates[students[index]].append(value)
>>> {
'Michael': [{'History': 50, 'Mathematics': 90, 'Physics': 70}],
'George': [{'History': 70, 'Mathematics': 85, 'Physics': 30}],
'Jesica': [{'History': 60, 'Mathematics': 50, 'Physics': 60}]
}

Но вы можете сделать свой код максимально понятным, используя defaultdict():

from collections import defaultdict
certificates = defaultdict(list)
for index, value in enumerate(grades):
certificates[students[index]].append(value)

>>> defaultdict(<class ‘list’>, {‘Michael’: [{‘History’: 50, ‘Mathematics’: 90, ‘Physics’: 70}], ‘George’: [{‘History’: 70, ‘Mathematics’: 85, ‘Physics’: 30}], ‘Jesica’: [{‘History’: 60, ‘Mathematics’: 50, ‘Physics’: 60}]})

В приведенном выше примере мы устанавливаем default_factory как список, и если мы вызываем отсутствующий ключ, мы получаем пустой список [] как значение по умолчанию для отсутствующего ключа. Также мы можем задать любые типы данных: int, str, dict, float, set, tuple, list.

Давайте попробуем все эти типы данных и проверим результаты:

test_dict = defaultdict(int)
>>> 0
test_dict = defaultdict(float)
>>> 0.0
test_dict = defaultdict(dict)
>>> {}
test_dict = defaultdict(list)
>>> []
test_dict = defaultdict(tuple)
>>> ()
test_dict = defaultdict(set)
>>> set()
test_dict = defaultdict(str)
>>> ‘’

Также вы можете установить собственное значение по умолчанию. default_factory должен быть вызываемым, поэтому мы можем сделать следующее:

test_dict = defaultdict(lambda: “Default value by lambda”)
test_dict[missing_key]
>>> ‘Default value by lambda’

или

def test_function():
return “Default value by usual function”test_dict = defaultdict(test_function)
>>> ‘Default value by usual function’

НО, если вы не установите default_factory, возвращаемое значение будет равно None, и в этом случае, если вы попытаетесь вызвать отсутствующий ключ, вы получите KeyError:

test_dict = defaultdict()
test_dict[“missing_key”]
>>> KeyError: missing_key

Спасибо за прочтение! Еще больше интересного в нашем канале.