Введение в словари Python

Завершено

Переменные в Python могут хранить различные типы данных. Ранее вы узнали, что вы можете хранить строки и числа:

name = 'Earth'
moons = 1

Хотя этот метод работает для небольших объемов данных, он может стать все более сложным при работе с связанными данными. Представьте, что вы хотите хранить информацию о лунах Земли и лунах Юпитера.

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'))
Earth

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

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

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

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

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

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

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

# No output: name is now set to Makemake.

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

planet['name'] = 'Makemake'

# No output: name is now set to Makemake.

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

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

Использование обновления:

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

Использование квадратных квадратных скобок:

planet['name'] = 'Jupiter'
planet['moons'] = 79

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

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

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

planet['orbital period'] = 4333

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

Важно!

Имена ключей, как и все остальное в Python, чувствительны к регистру. В результате 'name' и 'Name' воспринимаются как два отдельных ключа в словаре Python.

Чтобы удалить ключ, используйте 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"]}')
Jupiter polar diameter: 133709