На этом занятии
мы познакомимся с еще одной коллекцией данных в Python – словарем. В
отличие от списков
Словарь – это
неупорядоченная коллекция произвольных данных с доступом по ключу.
Это подобно
ассоциативному массиву, когда данные представляются в виде пар
ключ => значение
Например, в
качестве ключа могут выступать обычные уникальные числа:
0, 1, 2, …
В этом случае
ключи напоминают индексы элементов упорядоченного списка:
A = ["дом", "машина", "дерево", "дорога", "река"]
Но в списке изменить эти индексы мы не можем – они создаются списком автоматически. А, что если мы
хотим ассоциировать эти слова со словами английского языка:
Как раз здесь
нам на помощь и приходит словарь. То есть, мы вместо ключей 0, 1, 2,… создадим
другие – в виде английских слов.
Для создания
словаря используется следующий синтаксис:
{key1:
value1, key2: value2, …, keyN:valueN}
И для нашего
случая, имеем:
d = {"house": "дом", "car": "машина",
"tree": "дерево", "road": "дорога",
"river":"река"}
Как видите, мы
можем определять словарь в несколько строчек. Не обязательно все писать в одну
строку.
Теперь, мы можем
по ключу получать значение этого словаря по такому же синтаксису, что и для
списков:
Получим значение
«дом». Если же указать не существующий ключ:
то получим
ошибку. Разумеется, ключи в словарях всегда уникальны. Если записать два
одинаковых:
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:
У объекта 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[True] = "Истина"
d[False] = "Ложь"
Здесь ключи –
булевые значения. В результате, получим словарь:
{True: 'Истина', False: 'Ложь'}
И этот пример показывает,
что присваивая словарю значение с новым ключом, оно автоматически добавляется в
словарь. В результате, наш изначально пустой словарь стал содержать две записи.
Если же мы существующему ключу присваиваем другое значение:
то он просто
поменяет свое значение в словаре. Вот так можно добавлять и менять значения
словаря. То есть, словарь относится к изменяемым типам.
Далее, если мы укажем
в качестве ключа список:
то возникнет
ошибка, т.к. список – это изменяемый объект. И чаще всего в качестве ключей
используются строки или числа.
На значения
словаря никаких ограничений не накладывается – там могут быть произвольные
данные:
d = {True: 1, False: "Ложь", "list": [1,2,3], 5: 5}
Для удаления
ключа можно воспользоваться оператором del:
Теперь записи с
ключом True в словаре не
будет. Однако, если при удалении будет указан несуществующий ключ:
то возникнет
ошибка. Поэтому перед удалением, можно проверить: существует ли данный ключ в
словаре:
Оператор in возвращает True, если ключ
присутствует и False, если отсутствует. Или же, можно делать
противоположную проверку на отсутствие ключа:
Далее, как и для
любой коллекции, мы можем определить длину (число записей) в словаре с помощью
функции len:
А также
перебрать его значения с помощью цикла for:
d = {True: 1, False: "Ложь", "list": [1,2,3], 5: 5}
for x in d:
print(x)
И мы видим, что
переменная x ссылается на
значения ключей. Но, зная ключи, мы можем получить ассоциированное с ним
значение:
Это основные моменты работы со словарем. На следующем занятии мы рассмотрим базовые методы для словарей.