Словари в Python

На этом занятии мы познакомимся с еще одной коллекцией данных в Python – словарем. В отличие от списков

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

Это подобно ассоциативному массиву, когда данные представляются в виде пар

ключ => значение

Например, в качестве ключа могут выступать обычные уникальные числа:

0, 1, 2, …

В этом случае ключи напоминают индексы элементов упорядоченного списка:

A = ["дом", "машина", "дерево", "дорога", "река"]

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

Как раз здесь нам на помощь и приходит словарь. То есть, мы вместо ключей 0, 1, 2,… создадим другие – в виде английских слов.

Для создания словаря используется следующий синтаксис:

{key1: value1, key2: value2, …, keyN:valueN}

И для нашего случая, имеем:

d = {"house": "дом", "car": "машина",
"tree": "дерево", "road": "дорога",
"river":"река"}

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

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

d["house"]

Получим значение «дом». Если же указать не существующий ключ:

d[100]

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

d = {"house": "дом", "house": "дом 2", "car": "машина"}

то ключ «house» будет ассоциирован с последним указанным значением – «дом 2».

Словарь еще можно определить с помощью функции-конструктора dict:

d2 = dict(house = "дом", car = "машина",
tree = "дерево", road = "дорога", river = "река")

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

d2 = dict(1 = "дом", 2 = "машина")

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

lst = [[2, "неудовлетворительно"], [3, "удовлетворительно"], [4, "хорошо"], [5, "отлично"]]

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

d3 = dict(lst)

У объекта dict есть один интересный метод:

dict.fromkeys(список[, значение по умолчанию])

который формирует словарь где ключами будут элементы списка. Например:

a = dict.fromkeys(["+7", "+6", "+5", "+4"])

Получим следующее:

{'+7': None, '+6': None, '+5': None, '+4': None}

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

a = dict.fromkeys(["+7", "+6", "+5", "+4"], "код страны")

получим словарь:

{'+7': 'код страны', '+6': 'код страны', '+5': 'код страны', '+4': 'код страны'}

Далее, если нужно создать пустой словарь, то это проще всего сделать так:

d = {}

или же так:

d = dict()

Во всех наших примерах в качестве ключей словаря выступало либо число, либо строка. Какие типы данных еще можно указывать? На самом деле любые неизменяемые типы. Обратите внимание, именно неизменяемые! Например, можно написать так:

d[True] = "Истина"
d[False] = "Ложь"

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

{True: 'Истина', False: 'Ложь'}

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

d[True] = 1

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

Далее, если мы укажем в качестве ключа список:

d[[1,2]] = 1

то возникнет ошибка, т.к. список – это изменяемый объект. И чаще всего в качестве ключей используются строки или числа.

На значения словаря никаких ограничений не накладывается – там могут быть произвольные данные:

d = {True: 1, False: "Ложь", "list": [1,2,3], 5: 5}

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

del d[True]

Теперь записи с ключом True в словаре не будет. Однако, если при удалении будет указан несуществующий ключ:

del d["abc"]

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

"abc" in d

Оператор in возвращает True, если ключ присутствует и False, если отсутствует. Или же, можно делать противоположную проверку на отсутствие ключа:

"abc" not in d

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

len(d)

А также перебрать его значения с помощью цикла for:

d = {True: 1, False: "Ложь", "list": [1,2,3], 5: 5}
for x in d:
   print(x)

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

print(x, d[x])

Это основные моменты работы со словарем. На следующем занятии мы рассмотрим базовые методы для словарей.

Видео по теме