Уроки технологии
Технология Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Словари

Словари Python позволяют моделировать сложные данные. В этом модуле рассматриваются распространенные сценарии, в которых можно использовать словари. Цели обучения

К концу этого модуля вы сможете:

Определять, когда следует использовать словарь.
Создавать и изменять данные внутри словаря.
Использовать методы keys и values для доступа к данным словаря.

Сценарий: анализ Солнечной системы

Предположим, вы создаете программу для анализа количества спутников разных планет в Солнечной системе. Вы хотите отображать эти сведения для пользователя и иметь возможность вычислять различные значения, например общее число спутников в Солнечной системе. Потребовалось бы слишком много усилий, чтобы выполнить эту задачу с помощью переменных, в которых может храниться только строка или число.

В этом модуле вы создадите программу, которая может выполнять эти типы операций. Для моделирования данных будут использоваться словари Python. К концу модуля вы научитесь использовать словари Python для хранения сложных данных.

Переменные в Python могут хранить различные типы данных. Ранее вы узнали, что вы можете хранить строки и числа. Хотя это удобно, если у вас небольшой объем данных, при работе со связанными данными задача может усложняться. Представьте, что вам нужно хранить сведения о спутниках Земли и Юпитера.

earth_name = 'Earth'
earth_moons = 1

jupiter_name = 'Jupiter'
jupiter_moons = 79

Обратите внимание на то, как дублируются переменные с разными префиксами. Это может оказаться неудобным. Так как вам часто придется работать со связанными наборами данных, например среднее количество осадков за разные месяцы в разных городах, хранить эти значения в виде отдельных переменных будет неудобно. Здесь могут помочь словари Python.

Словари Python позволяют работать со связанными наборами данных. Словарь — это коллекция пар “ключ-значение”. Считайте, что словарь — это группа переменных внутри контейнера, где ключ — это имя переменной, а значение — значение, хранящееся в нем.

Создание словаря

Python использует фигурные скобки ({ }) и двоеточие (:) для обозначения словаря. Можно либо создать пустой словарь и добавить значения позже, либо заполнить его во время создания. Каждая пара “ключ-значение” отделяется двоеточием, а имя каждого ключа заключается в кавычки как строковый литерал. Поскольку ключ является строковым литералом, можно использовать любое имя, которое подходит для описания значения.

Давайте создадим словарь для хранения названия планеты Земля и числа ее спутников:

planet = {
    'name': 'Earth',
    'moons': 1
}

У вас есть два ключа, ’name’ и ‘moons’. Каждый из них во многом аналогичен переменной: у них есть уникальное имя, и они хранят значение. Однако они содержатся в одной более крупной переменной с именем planet.

Так же, как и в случае с обычными переменными, необходимо убедиться, что используются правильные типы данных. В значении moons1 в предыдущем примере число не было заключено в кавычки, так как вы хотите использовать целое число. Если бы вы использовали ‘1’, Python считал бы это значение строкой, что помешало бы выполнять вычисления.

В отличие от обычных переменных, имена ключей не должны соответствовать стандартным правилам именования для Python. Вы можете выбирать описательные имена.

Чтение значений словаря

Значения в словаре можно считывать. У объектов словаря есть метод get, который можно использовать для доступа к значению с помощью его ключа. Если вы хотите вывести name, можно использовать следующий код:

print(planet.get('name'))

# Displays Earth

Как вы понимаете, получение доступа к значениям в словаре является обычной операцией. К счастью, существует быстрый способ ее выполнения. Можно также передать ключ в квадратных скобках ([ ]). Этот синтаксис требует меньше кода, чем get, и большинство программистов используют его. Вы можете переписать предыдущий пример, используя следующий код:

# planet['name'] is identical to using planet.get('name')
print(planet['name'])

# Displays Earth

Хотя get и квадратные скобки ([ ]) ведут себя одинаково при получении элементов, существует одно ключевое различие. Если ключ недоступен, get возвращает None, а [ ] вызывает KeyError.

wibble = planet.get('wibble') # Returns None
wibble = planet['wibble'] # Throws KeyError

Изменение значений словаря

Вы также можете изменять значения внутри объекта словаря с помощью метода update. Этот метод принимает словарь в качестве параметра и обновляет все существующие значения новыми, которые вы предоставили. Если вы хотите изменить name для словаря planet, можно использовать, например:

planet.update({'name': 'Makemake'})

# name is now set to Makemake

Квадратные скобки ([ ]) можно использовать не только для чтения, но и для изменения значений. Ключевое различие в синтаксисе заключается в том, что для предоставления нового значения используется = (иногда называемый оператором присваивания). Чтобы переписать предыдущий пример для изменения имени, можно использовать следующее:

planet['name'] = 'Makemake'

# name is now set to Makemake

Ключевое преимущество использования update — возможность изменения нескольких значений за одну операцию. Два следующих примера логически одинаковы, но синтаксис различается. Вы можете использовать любой подходящий синтаксис. Для обновления отдельных значений большинство разработчиков выбирают квадратные скобки.

Следующий пример вносит те же изменения в переменную planet, обновляя название и спутники. Обратите внимание, что при использовании update вы делаете один вызов функции, тогда как при использовании квадратных скобок требуется два вызова.

# Using update
planet.update({
    'name': 'Jupiter',
    'moons': 79
})

# Using square brackets
planet['name'] = 'Jupiter'
planet['moons'] = 79

Добавление и удаление ключей

При инициализации словаря вам не нужно создавать все ключи. Можно не создавать ни одного. Если вам нужно создать новый ключ, вы назначаете его точно так же, как и существующий.

Предположим, что вы хотите обновить planet, чтобы включить период обращения вокруг планеты в днях:

planet['orbital period'] = 4333

# planet dictionary now contains: {
#   name: 'jupiter'
#   moons: 79
#   orbital period: 4333
# }

Чтобы удалить ключ, используйте pop. pop возвращает значение и удаляет ключ из словаря. Для удаления orbital period можно использовать следующий код:

planet.pop('orbital period')

# planet dictionary now contains: {
#   name: 'jupiter'
#   moons: 79
# }

Сложные типы данных

Словари могут хранить любые типы значений, включая другие словари. Это позволяет моделировать сложные данные по мере необходимости. Представьте, что вам необходимо сохранить диаметр для planet, который может измеряться по экватору или по полюсам. Вы можете создать другой словарь внутри planet для хранения этих сведений:

# Add address
planet['diameter (km)'] = {
    'polar': 133709,
    'equatorial': 142984
}

# planet dictionary now contains: {
#   name: 'Jupiter'
#   moons: 79
#   diameter (km): {
#      polar: 133709
#      equatorial: 142984
#   }
# }

Чтобы извлечь значения во вложенном словаре, можно объединить квадратные скобки или вызовы к get.

print(f'{planet['name']} polar diameter: {planet['diameter (km)']['polar']}')

# Output: Jupiter polar diameter: 133709

Динамическое программирование с помощью словарей

В программе необходимо выполнять различные вычисления, например подсчитать общее число спутников. Кроме того, когда вы будете создавать более сложные программы, такие данные будут поступать из файлов или базы данных, и вы не будете напрямую программировать их в Python.

Для таких сценариев Python позволяет обрабатывать ключи и значения внутри словаря в виде списка. Вы можете динамически определять ключи и значения, а также выполнять различные вычисления.

Представьте себе словарь, в котором хранится количество осадков по месяцам. Скорее всего, у вас есть ключи для каждого месяца и соответствующее количество осадков. Вы хотите посчитать общее количество осадков, и пришлось бы потратить много сил, чтобы написать код для выполнения этой операции с использованием каждого отдельного ключа.

Получение всех ключей и значений

Метод keys() возвращает объект списка, содержащий все ключи. Этот метод можно использовать для перебора всех элементов в словаре.

Представьте, что у вас есть следующий словарь, в котором хранятся данные о количестве осадков за последние три месяца.

rainfall = {
    'october': 3.5,
    'november': 4.2,
    'december': 2.1
}

Предположим, вы хотите отобразить список всех осадков. Вы можете ввести название каждого месяца, но это слишком долго.

for key in rainfall.keys():
    print(f'{key}: {rainfall[key]}cm')

# Output:
# october: 3.5cm
# november: 4.2cm
# december: 2.1cm

Определение существования ключа в словаре

При обновлении значения в словаре Python либо перезаписывает существующее значение, либо создает новое, если ключ не существует. Если вы хотите добавить значение вместо перезаписи, можно проверить, существует ли ключ, с помощью in. Например, если вы хотите добавить значение для декабря или создать новое значение, если оно не существует, можно использовать следующую команду:

if 'december' in rainfall:
    rainfall['december'] = rainfall['december'] + 1
else:
    rainfall['december'] = 1

# Because december exists, the value will be 3.1

Получение всех значений

Как и keys(), values() возвращает список всех значений в словаре без соответствующих ключей. Это может быть полезно, если вы используете ключ для меток, как в предыдущем примере, в котором ключи представляют собой название месяца. С помощью values() можно определить общее количество осадков:

total_rainfall = 0
for value in rainfall.values():
    total_rainfall = total_rainfall + value

print(f'There was {total_rainfall}cm in the last quarter')

# Output:
# There was 10.8cm in the last quarter