Полный обзор словарей в Python

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

  • Основы создания словарей для хранения и доступа к данным

  • Лучшие случаи использования словарей

  • Добавление и удаление данных в словарях

  • Как применять функции и методы к словарям

Оглавление

Что такое словари Python?

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

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

# Получение второго элемента в списке Python
names = ['Nik', 'Kate', 'Evan', 'Kyra']
second_name = names[1]  # Индексация в Python начинается с 0, поэтому второй элемент имеет индекс 1
print(second_name)

# Возвращает: Kate

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

В Python словаре может быть несколько ключей. Эти ключи должны быть:

  • Уникальный – заданный ключ может существовать только один раз

  • Неизменяемый – это значит, что ключи должны быть таких типов данных, которые нельзя изменить, например, строки

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

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

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

# Создание словаря в Python
dictionary1 = {}       # Пустой словарь, созданный с использованием фигурных скобок
dictionary2 = dict()   # Пустой словарь, созданный с использованием функции dict()

Мы можем проверить тип этих словарей, используя встроенную функцию

# Проверка типов словарей в Python
print(type(dictionary1))  # Проверяем тип dictionary1
print(type(dictionary2))  # Проверяем тип dictionary2

# Возвращает:
# <class 'dict'>
# <class 'dict'>

Аналогично, мы можем загрузить заполненный словарь напрямую. Давайте посмотрим, как это выглядит на примере загрузки словаря с атрибутами человека:

# Создание примерного словаря в Python
nik = {
    'age': 33,  # Возраст
    'location': 'Toronto',  # Местоположение
    'company': 'bemind.gitbook.io',  # Компания
    'hobbies': ['Python', 'Long walks on the beach', 'Travel']  # Хобби
}

Здесь мы видим, что смогли встроить несколько разных элементов в качестве значений. Например, у нас есть целое число (представляющее возраст), строки (представляющие, скажем, местоположение) и даже списки!

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

# Создание примерного словаря в Python
nik = {
    'age': 33,  # Возраст
    'location': 'Toronto',  # Местоположение
    'company': 'bemind.gitbook.io',  # Компания
    'hobbies': ['Python', 'Long walks on the beach', 'Travel']  # Хобби
}

Теперь, когда у вас есть хорошее понимание того, как создавать словари в Python, давайте взглянем на то, как их использовать.

Как словари связаны с наукой о данных?

На этом этапе вы можете задаться вопросом, как связаны словари с наукой о данных? Когда мы получаем данные из интернета, они часто приходят в формате, известном как JSON (JavaScript Object Notation). Этот формат очень похож на формат словарей в Python.

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

Работа со словарями Python

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

Доступ к элементам в словарях Python

Существуют два основных способа доступа к элементам внутри словаря. Можно использовать квадратные скобки, [], аналогично обращению к элементу списка по его индексу. Также можно использовать метод .get()

Давайте посмотрим, как мы можем использовать квадратные скобки для доступа к элементу.

# Доступ к элементам словаря с помощью квадратных скобок
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
print(info['name'])  # Получаем значение по ключу 'name'

# Возвращает: Nik

Это было легко! Одним из недостатков использования метода доступа через квадратные скобки является то, что он плохо работает с несуществующими элементами.

Попробуйте запустить приведенный ниже код для доступа к элементу, который не существует, например, 'hobbies', чтобы увидеть, что произойдет:

Мы видим, что при попытке доступа к несуществующему элементу выбрасывается KeyError. Это указывает на то, что ключ не существует. Хуже всего то, что это фактически приводит к сбою нашей программы (если мы явно не обрабатываем эту ошибку).

Один из способов обойти это - использовать метод .get(). Метод .get() просто вернет значение None, когда ключ не существует.

Метод работает путем применения его к словарю и передачи ключа, значение которого мы хотим вернуть. Давайте посмотрим, как мы можем использовать это для возврата значения для 'name'

# Доступ к элементам словаря с помощью метода get
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
print(info.get('name'))  # Получаем значение по ключу 'name' с помощью метода get

# Возвращает: Nik

Одно из преимуществ использования метода .get() заключается в том, что мы можем передать значение по умолчанию, которое мы хотим получить, если ключ не существует. Например, если у нас должен был быть ключ с именем 'hobbies', содержащий список различных увлечений, мы можем попросить Python вернуть пустой список вместо None.

Посмотрите, сможете ли вы написать код ниже, чтобы это произошло. Решение доступно по нажатию переключателя:

Добавление элементов в словари Python

Добавление элементов в словарь Python невероятно просто! Мы можем просто напрямую присвоить паре key:value словарь.

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

# Добавление элементов в словарь Python
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
info['hobbies'] = ['Coding', 'Long Walks on the Beach']  # Добавляем новый ключ 'hobbies' и его значение

print(info)
# Возвращает: {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'hobbies': ['Coding', 'Long Walks on the Beach']}

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

Для этого можно использовать метод .update(). Аналогично, в Python 3.8+ можно использовать оператор |. Оба метода работают одинаково: словарь справа будет объединен со словарем слева. Любые новые пары "ключ-значение" будут добавлены, а существующие ключи в левом словаре будут обновлены значениями из правого.

# Объединение двух словарей в Python
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
more_info = {'company': 'datagy.io', 'location': 'Toronto, ON'}

info.update(more_info)  # Объединяем словари (существующие ключи перезаписываются значениями из more_info)

print(info)
# Возвращает: {'name': 'Nik', 'age': 33, 'location': 'Toronto, ON', 'company': 'datagy.io'}

Мы видим, что новые элементы из словаря more_info были добавлены, а существующие элементы были обновлены. Имейте это в виду при обновлении информации!

Изменение существующих элементов словаря Python

Изменение существующих элементов работает так же, как добавление новых! Мы можем просто напрямую присвоить значение существующему ключу и обновить его значение. Дополнительное преимущество в том, что если элемент не существует, то добавляется новый.

Давайте рассмотрим добавление изменения нашего ключа 'location' в нашем словаре:

# Изменение элементов в словаре Python
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
info['location'] = 'Toronto, ON'  # Изменяем значение по ключу 'location'

print(info)

# Возвращает: {'name': 'Nik', 'age': 33, 'location': 'Toronto, ON'}

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

Удаление элементов из словарей в Python

Подобно спискам, Python предоставляет несколько способов удаления элементов из словарей. Первый подход, который мы рассмотрим, — использование ключевого слова del. Это ключевое слово принимает элемент словаря и удаляет его из словаря.

Давайте посмотрим, как мы можем использовать ключевое слово для удаления элемента:

# Удаление элемента из словаря с помощью del
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
del info['age']  # Удаляем элемент с ключом 'age'

print(info)

# Возвращает: {'name': 'Nik', 'location': 'Toronto'}

Мы также можем использовать метод .pop() в Python, чтобы удалить элемент из словаря. Преимущество этого подхода в том, что он возвращает значение до удаления пары ключ-значение. Давайте посмотрим, как это выглядит:

# Использование метода .pop() для удаления элемента из словаря
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}
age = info.pop('age')  # Удаляем элемент с ключом 'age' и возвращаем его значение

print(age)  # Выводим удаленное значение 'age'
print(info)  # Выводим обновленный словарь без удаленного элемента

# Возвращает: 
# 33
# {'name': 'Nik', 'location': 'Toronto'}

Оба этих метода требуют внимательности, чтобы не удалять несуществующие ключи. Оба этих метода вернут KeyError, если мы попытаемся удалить несуществующий ключ. Давайте это подтвердим:

# Попытка удалить ключ, которого не существует
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Пытаемся удалить ключ 'hobbies', которого нет в словаре
# В результате возникает исключение KeyError, так как ключ 'hobbies' отсутствует в словаре
age = info.pop('hobbies')

# Вызывает: KeyError: 'hobbies'

Метод .pop() позволяет нам задать значение по умолчанию, чтобы программа не завершалась с ошибкой, если ключ не существует. Это позволяет нам безопаснее запускать программу.

Давайте посмотрим, как это работает:

# Безопасное использование метода .pop() с заданным значением по умолчанию
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Пытаемся удалить ключ 'hobbies', если он есть в словаре. Если ключа нет, возвращается значение по умолчанию - пустой список.
age = info.pop('hobbies', [])

print(age)

# Возвращает: []

Хотя, конечно, это не удаляет ключ, это позволяет нам безопаснее писать программы, которые требуют доступа к ключу и его удаления из словаря.

Методы словаря Python

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

Доступ к элементам словаря с помощью .items()

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

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

# Получение элементов словаря с помощью метода .items()
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Метод .items() возвращает представление словаря в виде списка кортежей (ключ, значение)
print(info.items())

# Возвращает: dict_items([('name', 'Nik'), ('age', 33), ('location', 'Toronto')])

Мы можем перебирать объект dict_items, чтобы получить доступ как к ключам, так и к значениям.

Доступ к ключам словаря с помощью .keys()

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

Давайте возьмем наш предыдущий словарь и применим метод .keys()

# Получение всех ключей словаря с помощью метода .keys()
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Метод .keys() возвращает представление всех ключей словаря
print(info.keys())

# Возвращает: dict_keys(['name', 'age', 'location'])

Доступ к значениям словаря с помощью .values()

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

Давайте применим метод .items() к нашему словарю:

# Получение всех значений словаря с помощью метода .values()
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

# Метод .values() возвращает представление всех значений словаря
print(info.values())

# Возвращает: dict_values(['Nik', 33, 'Toronto'])

Проверка членства в словарях Python

Для проверки наличия ключа в словаре Python удобно использовать ключевое слово in. Давайте посмотрим, как можно проверить, существует ли ключ в словаре, с помощью метода .keys()

# Проверка наличия ключа в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

if 'name' in info.keys():  # Проверяем, существует ли ключ 'name' в словаре
    print('Exists!')  # Если ключ существует, выводим 'Exists!'
else:
    print("Doesn't exist!")  # Если ключ не существует, выводим "Doesn't exist!"

# Возвращает: Exists!

На самом деле мы можем упростить этот процесс, не используя метод .keys(). По умолчанию Python будет проверять членство в ключах словаря. Из-за этого мы можем даже опустить этот метод из нашей проверки членства:

# Проверка наличия ключа в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

if 'name' in info:  # Проверяем, существует ли ключ 'name' в словаре
    print('Exists!')  # Если ключ существует, выводим 'Exists!'
else:
    print("Doesn't exist!")  # Если ключ не существует, выводим "Doesn't exist!"

# Возвращает: Exists!

В следующем разделе вы узнаете, как итерироваться по словарям в Python.

Перебор словарей Python

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

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

# Перебор всех ключей в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

for key in info.keys():  # Перебираем все ключи в словаре
    print(key)

# Возвращает: 
# name
# age
# location

Этот подход работает так же для .items().

Но что, если вы хотите перебрать ключи и значения одновременно? Для этого можно использовать так называемую распаковку. Мы можем перебирать возвращаемое значение метода .items() и распаковывать ключ и значение из возвращаемого кортежа.

Давайте посмотрим, как это выглядит:

# Перебор и ключей, и значений в словаре
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto'}

for key, value in info.items():  # Перебираем пары ключ-значение в словаре
    print('Key = ', key, ', Value = ', value)

# Возвращает: 
# Key =  name , Value =  Nik
# Key =  age , Value =  33
# Key =  location , Value =  Toronto

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

Упорядочены ли словари Python?

Ответ на вопрос о том, упорядочены ли словари в Python, не является простым да или нет. До версии 3.6 словари в Python были неупорядоченными. Начиная с версии 3.6 (и официально с версии 3.7), словари в Python стали упорядоченными.

Теперь словари Python упорядочены на основе порядка вставки. Это обеспечивает более быстрый доступ.

Упражнение

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

Создайте словарь, подобный приведенному ниже, и выполните следующие упражнения:

# Загрузка словаря в редактор кода ниже
info = {'name': 'Nik', 'age': 33, 'location': 'Toronto', 'company': 'bemind.gitbook.io'}

Выведите все значения словаря с использованием цикла for

for value in info.values():
    print(value)

Добавить новый ключ, содержащий список значений

info['Favourite Snacks'] = ['Popcorn', 'Cookies']

Обновите ключ местоположения на «Ванкувер».

info['location'] = 'Vancouver'

Заключение и резюме

Фух! Вы дошли до конца руководства! Было много информации о словарях Python, и вы узнали о них множество новых вещей!

Краткий обзор всего, что вы узнали о словарях Python

  • К элементам можно обращаться с помощью методов .items(), .keys(), и .values().

  • Метод .pop() позволяет передавать значение по умолчанию, что позволяет программе работать безопасно, если ключ не существует.

  • Мы можем удалять элементы с помощью del или .pop().

  • Мы можем добавлять элементы, просто присваивая значение ключу.

  • Словари похожи на формат JSON, который часто используется для хранения данных в интернете.

  • Вы можете создать словари с помощью функции dict() или фигурных скобок {}.

  • Значения могут быть любого типа и могут дублироваться.

  • Ключи должны быть неизменяемыми и уникальными.

  • Словари — это ассоциативный массив значений, содержащий пары ключ

Дополнительные ресурсы

Посмотрите учебные пособия ниже для получения дополнительных ресурсов:

  • Python: сортировка словаря по значениям

  • Слияние словарей Python – объединение словарей (7 способов)

  • Python: Pretty Print a Dict (словарь) – 4 способа

  • Python: получить ключ словаря с максимальным значением (4 способа)

Last updated