Поиск по сайту:

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


Введение

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

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

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

Словарь выглядит так:

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

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

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

  • имя пользователя
  • онлайн
  • подписчики

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

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

  • самми-акула
  • Верно
  • 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[username]. Давайте распечатаем это:

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

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

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

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

sammy['followers']
# Returns 987

sammy['online']
# Returns True

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

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

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

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

Чтобы вернуть ключи, мы будем использовать метод 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 являются словарями профиля пользователя.

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

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)])

Возвращаемый формат — это список, состоящий из пар кортежей (key, value) с объектом представления 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 в нашем программном файле, он будет включать дополнительную пару ключ-значение.

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

Давайте рассмотрим словарь draw, который является одним из пользователей данной сети. Мы скажем, что сегодня у этого пользователя увеличилось количество подписчиков, поэтому нам нужно обновить целочисленное значение, переданное в ключ 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, которая запускается в командной строке и позволяет пользователю вводить дополнительные имена и связанные с ними имена пользователей:

# Define original dictionary
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# Set up while loop to iterate
while True:

    # Request user to enter a name
    print('Enter a name:')

    # Assign to name variable
    name = input()

    # Check whether name is in the dictionary and print feedback
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # If the name is not in the dictionary...
    else:

        # Provide feedback        
        print('I don\'t have ' + name + '\'s username, what is it?')

        # Take in a new username for the associated name
        username = input()

        # Assign username value to name key
        usernames[name] = username

        # Print feedback that the data was updated
        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(), чтобы изменить существующую пару ключ-значение, заменив заданное значение для определенного ключа.

Давайте изменим онлайн-статус Sammy с 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.