Понимание словарей в Python 3

Введение

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

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

Информация: Чтобы следовать примерам кода в этом руководстве, откройте интерактивную оболочку Python на вашей локальной системе, запустив команду python3. Затем вы можете копировать, вставлять или редактировать примеры, добавляя их после приглашения >>>.

A dictionary looks like this:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

Помимо фигурных скобок, в словаре также есть двоеточия (:).

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

  • 'username'
  • 'online'
  • 'followers'

Каждый из ключей в приведенном выше примере – это значения строки.

Слова справа от двоеточий являются значениями. Значения могут состоять из любого типа данных. Значения в вышеуказанном словаре:

  • 'sammy-shark'
  • True
  • 987

Каждое из этих значений является строкой, логическим или целым числом.

Давайте выведем словарь sammy:

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': True}

Просматривая вывод, порядок пар ключ-значение может измениться. В Python версии 3.5 и ранее тип данных словарь является неупорядоченным. Однако в Python версии 3.6 и позже тип данных словарь остается упорядоченным. Независимо от того, упорядочен ли словарь или нет, пары ключ-значение останутся неизменными, что позволяет нам получать доступ к данным на основе их относительного значения.

Необходимые условия

У вас должен быть установлен Python 3 и настроена среда программирования на вашем компьютере или сервере. Если у вас нет настроенной среды программирования, вы можете обратиться к руководствам по установке и настройке для локальной среды программирования или для среды программирования на вашем сервере, подходящей для вашей операционной системы (Ubuntu, CentOS, Debian и т. д.).

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

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

Доступ к элементам данных по ключам

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

Если мы хотим выделить имя пользователя Sammy, мы можем сделать это, вызвав sammy['username']. Давайте выведем это:

print(sammy['username'])
Output
sammy-shark

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

Вызывая ключ 'username', мы получаем значение этого ключа, которое равно 'sammy-shark'.

Оставшиеся значения в словаре sammy можно аналогично вызывать с использованием того же формата:

sammy['followers']
# Возвращает 987

sammy['online']
# Возвращает True

Используя пары ключ-значение словарей, мы можем обращаться к ключам, чтобы получить значения.

Использование методов доступа к элементам

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

  • dict.keys() изолирует ключи
  • dict.values() изолирует значения
  • dict.items() возвращает элементы в формате списка кортежей (ключ, значение)

Для получения ключей мы будем использовать метод dict.keys(). В нашем примере это будет использование имени переменной и sammy.keys(). Давайте передадим это в метод print() и посмотрим на вывод:

print(sammy.keys())
Output
dict_keys(['followers', 'username', 'online'])

Мы получаем вывод, в котором ключи помещены в объект представления итератора класса dict_keys. Затем ключи выводятся в формате списка.

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

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

for common_key in sammy.keys() & jesse.keys():
    print(sammy[common_key], jesse[common_key])

Словарь sammy и словарь jesse представляют собой словарь профиля пользователя.

Их профили имеют разные ключи, поскольку у Сэмми есть профиль в социальных сетях с соответствующими подписчиками, а у Джесси есть игровой профиль с соответствующими очками. 2 ключа, которые они имеют общие, – это имя_пользователя и статус онлайн, которые мы можем найти, когда запускаем эту небольшую программу:

Output
sammy-shark JOctopus True False

Мы определенно можем улучшить программу, чтобы сделать вывод более понятным для пользователя, но это демонстрирует, что dict.keys() можно использовать для проверки пересечения различных словарей и их отличий. Это особенно полезно для больших словарей.

Аналогично, мы можем использовать метод dict.values() для запроса значений в словаре sammy, который будет вызываться как sammy.values(). Давайте выведем их:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

print(sammy.values())
Output
dict_values([True, 'sammy-shark', 987])

Оба метода keys() и values() возвращают неотсортированные списки ключей и значений, присутствующих в словаре sammy, с объектами представления dict_keys и dict_values соответственно.

Если нас интересуют все элементы словаря, мы можем получить к ним доступ с помощью метода items():

print(sammy.items())
Output
dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])

Формат возвращаемого значения – список из пар кортежей (ключ, значение) с объектом представления dict_items.

Мы можем перебирать полученный формат списка с помощью цикла for. Например, мы можем вывести каждый ключ и значение заданного словаря, а затем сделать его более понятным для человека, добавив строку:

for key, value in sammy.items():
    print(key, 'is the key for the value', value)
Output
online is the key for the value True followers is the key for the value 987 username is the key for the value sammy-shark

Цикл for выше перебирал элементы в словаре sammy и выводил ключи и значения построчно с информацией, чтобы сделать это понятнее для людей.

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

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

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

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

Без использования метода или функции вы можете добавлять пары ключ-значение в словари, используя следующий синтаксис:

dict[key] = value

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

usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

usernames['Drew'] = 'squidly'

print(usernames)
Output
{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

Теперь мы видим, что словарь был обновлен с парой ключ-значение 'Drew': 'squidly'. Поскольку словари могут быть неупорядоченными, эта пара может встречаться где угодно в выводе словаря. Если мы позже будем использовать словарь usernames в нашем программном файле, он будет включать дополнительную пару ключ-значение.

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

Давайте рассмотрим словарь drew, который является одним из пользователей в данной сети. Мы скажем, что этот пользователь получил прирост подписчиков сегодня, поэтому нам нужно обновить целочисленное значение, переданное ключу 'followers'. Мы будем использовать функцию print(), чтобы проверить, что словарь был изменен.

drew = {'username': 'squidly', 'online': True, 'followers': 305}

drew['followers'] = 342

print(drew)
Output
{'username': 'squidly', 'followers': 342, 'online': True}

В выводе мы видим, что количество подписчиков увеличилось с целочисленного значения 305 до 342.

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

usernames.py
# Определение исходного словаря
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# Настройка цикла while для итерации
while True:

    # Запросить пользователя ввести имя
    print('Enter a name:')

    # Присвоить переменной имя
    name = input()

    # Проверить, есть ли имя в словаре, и вывести обратную связь
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # Если имя отсутствует в словаре...
    else:

        # Предоставить обратную связь
        print('I don\'t have ' + name + '\'s username, what is it?')

        # Принять новое имя пользователя для связанного имени
        username = input()

        # Присвоить значение имени пользователя ключу имени
        usernames[name] = username

        # Вывести обратную связь о том, что данные были обновлены
        print('Data updated.')

Давайте запустим программу в командной строке:

  1. python usernames.py

Когда мы запустим программу, мы получим что-то вроде следующего вывода:

Output
Enter a name: Sammy sammy-shark is the username of Sammy Enter a name: Jesse I don't have Jesse's username, what is it? JOctopus Data updated. Enter a name:

Когда мы закончим тестирование программы, мы можем нажать CTRL + C, чтобы выйти из программы. Вы можете настроить триггер для выхода из программы (например, введя букву q) с условным оператором, чтобы улучшить код.

Это показывает, как можно взаимодействовать с изменением словарей. С этой конкретной программой, как только вы выйдете из нее с помощью CTRL + C, вы потеряете все ваши данные, если не реализуете способ обработки чтения и записи файлов.

Мы также можем добавлять и изменять словари с помощью метода dict.update(). Это отличается от метода append() доступного в списках.

В словаре jesse ниже давайте добавим ключ 'followers' и присвоим ему целочисленное значение с помощью jesse.update(). После этого давайте print() обновленный словарь.

jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

jesse.update({'followers': 481})

print(jesse)
Output
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

Из вывода мы видим, что мы успешно добавили пару ключ-значение 'followers': 481 в словарь jesse.

Мы также можем использовать метод dict.update() для изменения существующей пары ключ-значение, заменяя заданное значение для определенного ключа.

Давайте изменить онлайн-статус Сэмми с True на False в словаре sammy:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

sammy.update({'online': False})

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': False}

Строка sammy.update({'online': False}) ссылается на существующий ключ 'online' и изменяет его логическое значение с True на False. Когда мы вызываем print() для словаря, мы видим обновление в выводе.

Для добавления элементов в словари или изменения значений мы можем использовать либо синтаксис dict[key] = value, либо метод dict.update().

Удаление элементов словаря

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

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

del dict[key]

Давайте возьмем словарь jesse, который представляет одного из пользователей. Мы скажем, что Джесси больше не использует онлайн-платформу для игры, поэтому мы удалим элемент, связанный с ключом 'points'. Затем мы выведем словарь, чтобы подтвердить, что элемент был удален:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

del jesse['points']

print(jesse)
Output
{'online': False, 'username': 'JOctopus', 'followers': 481}

Строка del jesse['points'] удаляет пару ключ-значение 'points': 723 из словаря jesse.

Если мы хотим очистить словарь от всех его значений, мы можем сделать это с помощью метода dict.clear(). Это сохранит данный словарь на случай, если нам понадобится использовать его позже в программе, но он больше не будет содержать никаких элементов.

Давайте удалим все элементы в словаре jesse:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

jesse.clear()

print(jesse)
Output
{}

Вывод показывает, что теперь у нас есть пустой словарь, не содержащий пар ключ-значение.

Если нам больше не нужен определенный словарь, мы можем использовать del, чтобы полностью избавиться от него:

del jesse

print(jesse)

Когда мы вызываем print() после удаления словаря jesse, мы получим следующую ошибку:

Output
... NameError: name 'jesse' is not defined

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

Заключение

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

Отсюда вы можете узнать больше о других типах данных в нашем учебнике “Понимание типов данных“.

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

Source:
https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3