Вступление
dictionary - это встроенный в Python типmapping. Словари сопоставляютkeys сvalues, и эти пары ключ-значение предоставляют полезный способ хранения данных в Python.
Обычно используемые для хранения связанных данных, таких как информация, содержащаяся в идентификаторе или профиле пользователя, словари состоят из фигурных скобок с обеих сторон{
}
.
Словарь выглядит так:
sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
Помимо фигурных скобок, в словаре есть также двоеточия (:
).
Слова слева от двоеточия являются ключами. Keys может состоять из любого неизменяемого типа данных. Ключи в словаре выше:
-
'username'
-
'online'
-
'followers'
Каждый из ключей в приведенном выше примере представляет собой значенияstring.
Слова справа от двоеточия являются значениями. Values может состоять из любого типа данных. Значения в словаре выше:
-
'sammy-shark'
-
True
-
987
Распечатаем словарь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.