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

Вступление

dictionary - это встроенный в Python типmapping. Словари сопоставляютkeys сvalues, и эти пары ключ-значение предоставляют полезный способ хранения данных в Python.

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

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

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

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

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

  • 'username'

  • 'online'

  • 'followers'

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

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

  • 'sammy-shark'

  • True

  • 987

Каждое из этих значений представляет собой строкуBoolean илиinteger.

Распечатаем словарьsammy:

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

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

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

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

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

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

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

print(sammy['username'])
Outputsammy-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())
Outputdict_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 общих ключа:username иonline status, которые мы можем найти, запустив эту небольшую программу:

Outputsammy-shark JOctopus
True False

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

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

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

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

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

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

print(sammy.items())
Outputdict_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)
Outputonline 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

# 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.')

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

python usernames.py

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

OutputEnter 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) сconditional statement, чтобы улучшить код.

Это показывает, как вы можете изменять словари в интерактивном режиме. В этой конкретной программе, как только вы выйдете из программы с помощьюCTRL + C, вы потеряете все свои данные, если не реализуете путь кhandle reading and writing files.

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

В приведенном ниже словаре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. Словари состоят из пар ключ-значение и обеспечивают способ хранения данных без использования индексации. Это позволяет нам получать значения, основываясь на их значении и отношении к другим типам данных.

Отсюда вы можете узнать больше о других типах данных в нашем учебнике «https://www.digitalocean.com/community/tutorials/understanding-data-types-in-python-3[Understanding Types Data]».

Вы можете увидеть тип данных словаря, используемый в проектах программирования, таких какweb scraping with Scrapy.