Сегодня мы с вами поговорим о словарях и множествах. Наш модуль целиком посвящён изучению различных типов данных. Их довольно много, и вся информация, с которой мы работаем, представляет собой какой-то конкретный тип данных. Мы уже познакомились с числами, строками и списками, то есть с коллекциями, которые могут содержать много элементов одновременно.
Есть одна особая коллекция, которая также позволяет хранить в себе несколько значений, но не привычным для нас образом, а по парам: ключ и значение.
Создадим пример словаря, например, телефонную книгу, где ключом будет имя, а значением — номер телефона. Запускаем. Обратите внимание, что всё сработало: значения хранятся таким образом: первым мы указываем наш ключ, вторым — значение, а ключ и значение разделяются двоеточием. По сути, пара "ключ-значение" представляет собой в словаре один объект. То есть, если в списке мы просто писали элементы через запятую, то здесь нам нужно указать пару элементов "ключ" и "значение" (Рис. 1).
Рис.1
Что стоит учесть при работе со словарями? Ключом у нас может быть только неизменяемый объект. Мы не можем использовать, например, список в качестве ключа. Если обернуть «Denis» в квадратные скобки и запустить, мы увидим, что его нельзя использовать в качестве ключа. Выводится ошибка, указывающая на то, что список — это «unhashable» объект, то есть изменяемый объект (Рис. 2).
Рис.2
Убираем список и запускаем, все снова заработало (Рис.3).
Рис.3
Итак, какие у нас есть методы для работы со словарём? Например, если мы хотим обратиться к какому-то конкретному элементу, как это делали в списке. Вспоминаем, что в списках мы использовали индексацию, а здесь, чтобы обратиться к элементу словаря, нужно указать в квадратных скобках его ключ. Если мы сейчас обратимся к ключу «Denis», то получим номер телефона из телефонной книги (Рис. 4).
Рис.4
Что произойдет, если мы попытаемся заменить значение? Возьмём нашу телефонную книгу и присвоим значению по ключу «Denis» какое-то новое число. Затем выведем телефонную книгу. Запускаем: мы видим, что значение, которое соответствует ключу «Denis», изменилось (Рис. 5).
Рис.5
Точно так же, как и в списках, мы можем изменять значения в словаре, который является изменяемой структурой данных. То есть словарь относится к изменяемым типам данных.
Что произойдет, если мы попробуем обратиться к несуществующему ключу? Если мы возьмём `phone_book` и напишем «Anton», указав какой-то номер, то в случае со списками, обратившись по несуществующему индексу, мы получили бы ошибку. Однако в случае со словарём, если мы обращаемся к несуществующему ключу, он просто создаётся и добавляется в наш основной словарь (Рис. 6).
Рис.6
Если мы хотим удалить какое-то значение по ключу, можем воспользоваться оператором `del`. Для этого берём словарь и указываем ключ, который хотим удалить. Например, если мы удалим ключ «Max», он исчезнет из основного словаря (Рис. 7).
Рис.7
Но помимо таких простых обращений, в словаре существует множество методов, которые могут быть полезны в работе. Мы рассмотрим несколько из них, которые могут оказаться особенно полезными.
Метод «update»
Первый метод — это `update`. Он может быть полезен, если нам нужно обновить несколько пар ключ-значение сразу. Чтобы использовать этот метод, мы просто пишем имя словаря, ставим точку и указываем `update`. Этот метод принимает другой словарь, который мы указываем в скобках.
Например, если мы добавим значение «Sahsa» с номером телефона и добавим ещё «Alex», и затем выведем наш словарь, то увидим, что и «Sahsa», и «Alex» успешно добавились. Таким образом, если нам необходимо внести несколько изменений одновременно и обновить несколько ключей и значений, метод `update` отлично подходит для этой задачи (Рис. 8).
Рис.8
Обратите внимание, что в словаре данные могут не отображаться в том порядке, в котором вы их вводили, объявляли или добавляли. Дело в том, что словарь представляет собой неупорядоченную коллекцию. Поэтому, если вы получите элементы в другом порядке при выводе, это не будет считаться ошибкой. Не думайте, что вы сделали что-то не так — это просто особенность работы со словарём.
Метод «get»
Из следующих методов, которые могут быть полезны в работе, — это метод `get`. Этот метод возвращает значение по указанному ключу. Например, если мы напишем `print(phone_book.get('Denis'))`, то получим значение, соответствующее этому ключу (Рис. 9).
Рис.9
Особенность метода `get` заключается в том, что если указанный ключ не будет найден, например, если мы введём «Kamila», он вернёт значение «None». Таким образом, вместо возникновения ошибки, метод просто вернёт пустое значение. Важно отметить, что мы не создаём новый ключ, если он не существует; в отличие от обращения через квадратные скобочки, это не приведёт к созданию нового элемента. Метод `get` лишь возвращает значение по указанному ключу или «None», если ключ отсутствует (Рис. 10).
Рис.10
В методе `get` также можно указать значение по умолчанию, которое будет возвращено вместо «None», если ключ не найден в словаре. Например, мы можем написать `phone_book.get('Kamila', 'Такого ключа нет')`. При запуске этого кода, если ключа «Kamila» нет в словаре, будет возвращено значение «Такого ключа нет» вместо пустого значения (Рис. 11).
Рис.11
Метод «pop»
Мы можем взять телефонную книгу, вызвать метод «pop» с ключом «Anton» и вывести телефонную книгу перед вызовом метода «pop», а затем — после его выполнения. Метод «pop» удаляет указанный ключ и возвращает соответствующее значение (Рис. 12).
Рис.12
Мы можем сохранить это значение в переменную, и при последующем выводе получим значение, соответствующее ключу «Anton». Метод «pop» как бы извлекает из словаря ключ и значение (Рис. 13).
Рис.13
Тот же самый метод существует и при работе со списками, и принцип у него точно такой же: для списков он просто вытащит значение по индексу. Мы указываем в списках не ключ, а индекс элемента, который мы хотим достать. Например, у нас есть список из нескольких элементов (list_.pop(0)). Запускаем. Элемент с индексом 0 был извлечён из списка, а в нём остались только элементы с индексами 2 и 3 (Рис. 14).
Рис.14
Метод «keys»
Метод «keys» позволит нам получить коллекцию ключей в нашем словаре. Что это значит? Давайте посмотрим. Возьмём нашу телефонную книгу и напишем «.keys». Запустим код и получим список ключей, которые есть в словаре. В телефонной книге есть ключи: «Denis», «Max», «Anton», «Sasha» и «Alex» (Рис. 15).
Рис.15
Метод «values»
Метод «values» будет возвращать значения из нашего словаря (Рис. 16).
Рис.16
Метод «items»
Если нам нужна пара ключ-значение, мы будем использовать метод «items». Метод «items» будет возвращать целые пары ключ-значение (Рис. 17).
Рис.17
Что касается самого словаря, то мы отметили, что на месте ключа не могут находиться изменяемые типы данных. Однако на месте значений такие типы данных могут использоваться (Рис. 18).
Рис.18
Словарь — достаточно полезная коллекция. Мы привели пример из телефонной книги именно для того, чтобы вы могли посмотреть хотя бы на практическое применение.
Таким же образом можно, например, реализовать систему логина и пароля. То есть у нас есть логин и какое-то значение, которое соответствует этому логину; оно будет являться паролем.
Кроме того, большая часть данных в веб-разработке будет представлять собой словари. В будущем мы с вами познакомимся с таким форматом, как JSON, который тоже, по сути, представляет собой словарь.
Но на этом занятие не заканчивается, так как нам ещё нужно рассмотреть ещё один тип данных — это множество.
Множество
Множество на самом деле — достаточно полезный тип данных и тоже представляет собой некую коллекцию. Оно содержит в себе несколько элементов и выглядит это так: фигурные скобочки, точно так же, как и в списке или кортеже. Запускаем, обратите внимание, какой результат получаем. Особенность множеств в том, что эта коллекция хранит уникальные значения. То есть если мы написали 1, 2, 3, 4 дважды, то в итоге мы их не увидим, потому что множество хранит только уникальные значения (Рис. 19).
Рис.19
Множество может хранить в себе элементы разных типов. То есть если добавим, например, какую-нибудь строку, значение «True», кортеж и выведем это множество, то увидим, что все элементы прекрасно себя чувствуют внутри него (Рис. 20).
Рис.20
Если нам нужно перевести что-то во множество, например, получить множество из списка, мы будем использовать команду `set`. Представим ситуацию, что у нас есть какой-нибудь список, и мы хотим из него создать множество, воспользовавшись командой `set`. Мы увидим, что все прекрасно работает (Рис. 21).
Рис.21
Если мы хотим заменить список полностью, то переменная `list` теперь будет содержать в себе не список, а множество (Рис. 22).
Рис.22
Особенность данной коллекции в том, что множество не содержит повторяющихся элементов. Однако стоит учесть, что Python не предоставляет прямого способа получения значения отдельных элементов множества. То есть, если в списках мы могли обращаться по индексам, то при попытке обратиться к элементу множества по индексу мы получим ошибку (Рис. 23).
Рис.23
Однако в будущем, когда мы будем изучать циклы, мы сможем пройтись по каждому элементу множества.
Методы «discard» и «remove»
Если нам нужно удалить какой-либо элемент, то есть два метода — «discard» и «remove», которые могут пригодиться для работы со множествами. Мы указываем, что хотим удалить. Например, если мы хотим удалить элемент 1 из множества, которое ранее представляло собой список. До удаления элементы были 1, 2, 3, а после удаления стало 2, 3 (Рис. 24).
Рис.24
Если мы заменим метод «discard» на «remove», результат будет тем же (Рис. 25).
Рис.25
Отличие этих двух методов в том, что «discard» не выдает ошибку, если элемент не найден во множестве.
Также можно использовать метод «pop» для удаления элемента. Метод «pop» позволяет извлечь (вынуть) какое-то значение. Если нам нужно добавить значение, а не удалить, мы используем метод «add».
Этот метод немного отличается от «append», который мы использовали ранее; здесь он называется «add», и добавленный элемент помещается в множество (Рис. 26).
Рис.26
На самом деле это тоже довольно интересная коллекция. Мы часто будем сталкиваться с ней в качестве параметров, когда будем разбирать функции. Если нам нужно получить только уникальные значения, то можно использовать множество.
По скольку я являюсь фрилансером, берусь за выполнение небольших проектов, и оказываю помощь в решении домашних заданий связанных с написанием кода на данном языке. Все подробности в моём Telegram канале : https://t.me/pythonrazrabotchik , подписывайтесь, там будет очень много интересного.