Словари Python — мощные инструменты для работы с данными. Они поддерживают разные методы, но функция setdefault() выделяется способностью упрощать код и эффективно работать со значениями по умолчанию.
Мы перевели для вас статью о функции setdefault(). В ней рассмотрим синтаксис, сценарии использования функции и покажем её пользу на практических примерах, а в подробном заключении сделаем основные выводы.
Разбираемся в функции setdefault()
Метод setdefault()
в словарях Python позволяет извлекать значение по указанному ключу, если он существует. Если ключа нет, функция вставляет ключ с указанным значением по умолчанию и возвращает это значение. Метод особенно полезен при работе со словарями, в которых обязательно нужен ключ и при этом, если ключа изначально нет, вам нужно инициализировать его значением по умолчанию.
Синтаксис
Так выглядит синтаксис метода setdefault()
:
dict.setdefault(key, default=None)
key
: выполняется поиск ключа в словаре.default
: если ключ не найден, задаётся и возвращается значение. Значение по умолчанию —None
.
Возвращаемое значение
Метод setdefault()
возвращает:
значение указанного ключа, существующего в словаре;
значение по умолчанию, если ключа в словаре нет.
Практические примеры
Чтобы понять, как функция setdefault()
работает в разных сценариях, давайте рассмотрим несколько практических примеров.
Пример 1. Базовый сценарий
Это пример базового использования метода setdefault()
.
# Creating a dictionary (создаём словарь)
fruits = {'apples': 5, 'oranges': 3}
# Using setdefault to get the value of an existing key (с помощью setdefault получаем значение существующего ключа)
apples_count = fruits.setdefault('apples', 10)
print('Apples:', apples_count)
# Using setdefault to add a new key with a default value (c помощью setdefault добавляем новый ключ со значением по умолчанию)
bananas_count = fruits.setdefault('bananas', 10)
print('Bananas:', bananas_count)
# Printing the updated dictionary (выводим обновлённый словарь)
print(fruits)
Результат:
![](https://habrastorage.org/getpro/habr/upload_files/2a2/d03/d1f/2a2d03d1f59f4c04a8e49bbae2104555.jpg)
Пример 2. Использование setdefault() в цикле
В этом примере с помощью метода setdefault()
подсчитаем частотность элементов в списке.
# List of fruits (список фруктов)
fruit_list = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
# Creating an empty dictionary to store the count (создаём пустой словарь для хранения подсчитанных значений)
fruit_count = {}
# Counting the frequency of each fruit (подсчитываем частотность каждого фрукта)
for fruit in fruit_list:
fruit_count.setdefault(fruit, 0)
fruit_count[fruit] += 1
# Printing the fruit count (выводим число подсчитанных фруктов)
print(fruit_count)
Результат:
![](https://habrastorage.org/getpro/habr/upload_files/12c/ef5/f9e/12cef5f9e7fbafc98b9940069ef5de77.jpg)
Пример 3. Использование setdefault() с вложенными словарями
В этом примере мы с помощью метода setdefault()
поработаем с вложенными словарями.
# Creating an empty dictionary to store student grades (создаём пустой словарь для хранения оценок студентов)
grades = {}
# List of student data (список сведений о студентах)
students = [
('Alice', 'Math', 'A'),
('Bob', 'Math', 'B'),
('Alice', 'Science', 'A'),
('Bob', 'Science', 'C')
]
# Inserting student grades into the dictionary (вставляем оценки студентов в словарь)
for name, subject, grade in students:
grades.setdefault(name, {})
grades[name].setdefault(subject, grade)
# Printing the grades dictionary (выводим словарь с оценками студентов)
print(grades)
Результат:
![](https://habrastorage.org/getpro/habr/upload_files/f74/fd1/460/f74fd14603a00cb093da26119221a1c7.jpg)
Пример 4. Использование setdefault() для сложных структур данных
В этом примере воспользуемся методом setdefault()
, чтобы сформировать словарь списков.
# List of student scores (список баллов студентов)
student_scores = [
('Alice', 85),
('Bob', 92),
('Alice', 88),
('Bob', 95)
]
# Creating an empty dictionary to store scores (создаём пустой словарь для хранения баллов)
scores = {}
# Inserting scores into the dictionary (вставляем баллы в словарь)
for name, score in student_scores:
scores.setdefault(name, []).append(score)
# Printing the scores dictionary (выводим словарь с баллами)
print(scores)
Результат:
![](https://habrastorage.org/getpro/habr/upload_files/671/640/f25/671640f2589474389c150132399e5272.jpg)
Что по итогу
Функция setdefault()
— универсальный эффективный инструмент работы со значениями по умолчанию в словарях Python. Она упрощает код, уменьшая необходимость в явных проверках и условных выражениях при работе с ключами в словарях. Научившись работать с методом setdefault()
, вы сможете писать более чистый код, характерный именно для Python, особенно в сценариях, где требуется ключ, который инициализируется значением по умолчанию.
Основные выводы:
Базовый сценарий. Метод
setdefault()
позволяет получать значение по имеющемуся ключу или задавать значение по умолчанию, если ключа нет.Подсчёт частоты.
setdefault()
можно использовать для эффективного подсчёта частоты элементов в списке.Вложенные словари. Метод
setdefault()
особенно полезен при работе с вложенными словарями, так как позволяет с лёгкостью обрабатывать сложные структуры данных.Создание сложных структур данных. Метод
setdefault()
можно использовать для формирования словарей списков или других сложных структур данных без явных проверок на наличие ключей.
Включив метод setdefault()
в свой инструментарий Python, можно повысить удобочитаемость, эффективность и надёжность кода. Эта встроенная функция, безусловно, поможет и начинающему, и опытному Python-разработчику качественнее работать со словарями и эффективно управлять значениями по умолчанию.
Чтобы расти, нужно выйти из привычной зоны и сделать шаг к переменам. Можно изучить новое, начав с бесплатных занятий:
Вводный курс магистратуры НИУ ВШЭ «Инженерия данных»;
1С-аналитика: как стать специалистом по автоматизации процессов.
Или открыть перспективы с профессиональным обучением и переподготовкой:
Онлайн-магистратура «Инженерия данных»;
Комментарии (11)
federix
20.08.2024 11:19+5Вот только каждый раз создавать большой объект при вызове setdefault может быть накладным. И код с defaultdict будет имхо проще и понятней.
t0rr
20.08.2024 11:19+1Поддерживаю
Пример 2 меняем наdefaultdict
, получается сильно прощеfrom collections import defaultdict fruit_list = ["apple", "banana", "apple", "orange", "banana", "apple"] fruit_count = defaultdict(int) for fruit in fruit_list: fruit_count[fruit] += 1 print(fruit_count) # {'apple': 3, 'banana': 2, 'orange': 1}
Пример 3
from collections import defaultdict grades = defaultdict(dict) students = [ ("Alice", "Math", "A"), ("Bob", "Math", "B"), ("Alice", "Science", "A"), ("Bob", "Science", "C"), ] for name, subject, grade in students: grades[name][subject] = grade print(grades)
Пример 4
from mypy.binder import defaultdict student_scores = [ ("Alice", 85), ("Bob", 92), ("Alice", 88), ("Bob", 95), ] scores = defaultdict(list) for name, score in student_scores: scores[name].append(score) print(scores)
LazyTalent
20.08.2024 11:19Спасибо, а то всю статью голову ломал: вроде и использовал этот метод, но всё было проще, а это, оказывается, я с defaultdict перепутал =)
lrdprdx
20.08.2024 11:19+1Виртуально поставил минус:
1) Статья переведена, но комментарии на английском
2) Результат выполнения программы я должен парсить со скрина (код в котором ещё и отличается от кода в тексте, как заметили выше)
3) Примеры высосаны из пальца и на статью не катит ИМХО
Я понимаю, что некоторые претензии не к переводчику, но я не знаю, какая тут политика голосования за переводы --- считаю, что я оцениваю конечный продукт.
Andrey_Solomatin
20.08.2024 11:19Виртуально поставил минус
Так поставьте реальный. Главная причина статьи это рекламные ссылки.
Если слабые статьи от компаний будут уходить в минус, то возможно компания пересмотрит свою политику по качеству.
kr_aleksey
20.08.2024 11:19+1Эффективнее на мой взгляд использовать collections.defaultdict. В этом случае обращаться можно напрямую по ключу без дополнительного вызова функции.
DrrRos
20.08.2024 11:19Так как set default возвращает значение, то в 3 примере можно зачейнить
grades.setdefault(name, {}).setdefault(subject, grade)
Andrey_Solomatin
Вы выбрали статью для перевода с одним лайком и совсем без коментов.
Ценность оригинала так себе.