Словари 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)

Результат:

Пример 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) 

Результат:

Пример 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)

Результат:

Пример 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)

Результат:

Что по итогу

Функция setdefault() — универсальный эффективный инструмент работы со значениями по умолчанию в словарях Python. Она упрощает код, уменьшая необходимость в явных проверках и условных выражениях при работе с ключами в словарях. Научившись работать с методом setdefault(), вы сможете писать более чистый код, характерный именно для Python, особенно в сценариях, где требуется ключ, который инициализируется значением по умолчанию.

Основные выводы:

  1. Базовый сценарий. Метод setdefault() позволяет получать значение по имеющемуся ключу или задавать значение по умолчанию, если ключа нет.

  2. Подсчёт частоты. setdefault() можно использовать для эффективного подсчёта частоты элементов в списке.

  3. Вложенные словари. Метод setdefault() особенно полезен при работе с вложенными словарями, так как позволяет с лёгкостью обрабатывать сложные структуры данных.

  4. Создание сложных структур данных. Метод setdefault() можно использовать для формирования словарей списков или других сложных структур данных без явных проверок на наличие ключей.

Включив метод setdefault() в свой инструментарий Python, можно повысить удобочитаемость, эффективность и надёжность кода. Эта встроенная функция, безусловно, поможет и начинающему, и опытному Python-разработчику качественнее работать со словарями и эффективно управлять значениями по умолчанию.


Чтобы расти, нужно выйти из привычной зоны и сделать шаг к переменам. Можно изучить новое, начав с бесплатных занятий:

Или открыть перспективы с профессиональным обучением и переподготовкой:

Комментарии (11)


  1. Andrey_Solomatin
    20.08.2024 11:19
    +3

    Вы выбрали статью для перевода с одним лайком и совсем без коментов.
    Ценность оригинала так себе.


  1. Alkhonor
    20.08.2024 11:19
    +1

    В 3 и 4 примерах в код-е пропущен for, на скринах они присутствуют


    1. blognetology
      20.08.2024 11:19

      Поправили, спасибо!


  1. federix
    20.08.2024 11:19
    +5

    Вот только каждый раз создавать большой объект при вызове setdefault может быть накладным. И код с defaultdict будет имхо проще и понятней.


    1. 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)
      


      1. LazyTalent
        20.08.2024 11:19

        Спасибо, а то всю статью голову ломал: вроде и использовал этот метод, но всё было проще, а это, оказывается, я с defaultdict перепутал =)


  1. lrdprdx
    20.08.2024 11:19
    +1

    Виртуально поставил минус:

    1) Статья переведена, но комментарии на английском

    2) Результат выполнения программы я должен парсить со скрина (код в котором ещё и отличается от кода в тексте, как заметили выше)

    3) Примеры высосаны из пальца и на статью не катит ИМХО

    Я понимаю, что некоторые претензии не к переводчику, но я не знаю, какая тут политика голосования за переводы --- считаю, что я оцениваю конечный продукт.


    1. Andrey_Solomatin
      20.08.2024 11:19

      Виртуально поставил минус


      Так поставьте реальный. Главная причина статьи это рекламные ссылки.
      Если слабые статьи от компаний будут уходить в минус, то возможно компания пересмотрит свою политику по качеству.


  1. kr_aleksey
    20.08.2024 11:19
    +1

    Эффективнее на мой взгляд использовать collections.defaultdict. В этом случае обращаться можно напрямую по ключу без дополнительного вызова функции.


  1. botay123
    20.08.2024 11:19

    А чем отличается от get?

    someDict.get(key, None)


  1. DrrRos
    20.08.2024 11:19

    Так как set default возвращает значение, то в 3 примере можно зачейнить

    grades.setdefault(name, {}).setdefault(subject, grade)