'''Тема урока: множества в Python
Создание множеств
Пустые множества
Встроенная функция set()
Вывод множеств
Аннотация. Начинаем изучение множеств в Python (тип данных set). Этот тип данных аналогичен математическим множествам,
 он поддерживает быстрые операции проверки наличия элемента в множестве, добавления и удаления элементов, операции
 объединения, пересечения и многие другие.

Множества
В прошлых уроках мы изучили три типа коллекций в Python:

списки – изменяемые коллекции элементов;
строки – неизменяемые коллекции символов;
кортежи – неизменяемые коллекции элементов.
Следующий тип коллекций (наборов данных) – множество.

Множество – структура данных, организованная так же, как математические множества.

Важно знать:

все элементы множества различны (уникальны), два элемента не могут иметь одинаковое значение;
множества неупорядочены, то есть элементы не хранятся в каком-то определенном порядке;
элементы множества должны относиться к неизменяемым типам данных;
хранящиеся в множестве элементы могут иметь разные типы данных.
Структура данных (data structure) — программная единица, позволяющая хранить и обрабатывать множество однотипных
 и/или логически связанных данных.

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

numbers = {2, 4, 6, 8, 10}
languages = {'Python', 'C#', 'C++', 'Java'}
Множество numbers состоит из 55 элементов, и каждый из них — целое число.

Множество languages состоит из 44 элементов, каждый из которых — строка.

Множества могут содержать значения разных типов данных:

info = {'Timur', 1992, 61.5}
Множество info содержит строковое значение, целое число и число с плавающей точкой.

   Не создавайте переменные с именем set. Это очень плохая практика.

Пустое множество
Создать пустое множество можно с помощью встроенной функции, которая называется set():

myset = set()   # пустое множество
Обратите внимание — создать пустое множество с помощью пустых фигурных скобок нельзя:

myset = {}  # создается словарь
С помощью пустых фигурных скобок создаются словари, так сложилось исторически, словари появились в Python раньше,
чем множества.

   Пустое множество создаётся исключительно через set()

Вывод множества
Для вывода всего множества можно использовать функцию print():

numbers = {2, 4, 6, 8, 10}
languages = {'Python', 'C#', 'C++', 'Java'}
mammals = {'cat', 'dog', 'fox', 'elephant'}

print(numbers)
print(languages)
print(mammals)
Функция print() выводит на экран элементы множества, в фигурных скобках, разделенные запятыми:

{2, 4, 6, 8, 10}
{'C#', 'Python', 'Java', 'C++'}
{'dog', 'cat', 'fox', 'elephant'}
Обратите внимание: при выводе множества порядок элементов может отличаться от существовавшего при его создании,
поскольку множества — неупорядоченные коллекции данных.

Встроенная функция set()
Встроенная функция set() помимо создания пустого множества может преобразовывать некоторые типы объектов в множества.

В функцию set() можно передать один аргумент. Передаваемый аргумент должен быть итерируемым объектом, таким как
список, кортеж или строковое значение. Отдельные элементы объекта, передаваемого в качестве аргумента, становятся
элементами множества:

myset1 = set(range(10))          # множество из элементов последовательности
myset2 = set([1, 2, 3, 4, 5])    # множество из элементов списка
myset3 = set('abcd')             # множество из элементов строки
myset4 = set((10, 20, 30, 40))   # множество из элементов кортежа
Пустое множество также можно создать передав функции set() в качестве аргумента пустой список, строку или кортеж:

emptyset1 = set([])         # пустое множество из пустого списка
emptyset2 = set('')         # пустое множество из пустой строки
emptyset3 = set(())         # пустое множество из пустого кортежа
Дубликаты при создании множеств
Множества не могут содержать повторяющиеся элементы. Если в функцию set() передать аргумент, содержащий повторяющиеся
 элементы, то в множестве появится только один из этих повторяющихся элементов.

Приведенный ниже код:

myset1 = {2, 2, 4, 6, 6}
​myset2 = set([1, 2, 2, 3, 3])
myset3 = set('aaaaabbbbccccddd')

print(myset1)
print(myset2)
print(myset3)
выводит (порядок элементов может отличаться):

{2, 4, 6}
{1, 2, 3}
{'b', 'c', 'd', 'a'}
Если требуется создать множество, в котором каждый элемент — строковое значение, содержащее более одного символа,
то используем код:

myset = set(['aaa', 'bbbb', 'cc'])

print(myset)
Приведенный выше код выводит (порядок элементов может отличаться):

{'bbbb', 'aaa', 'cc'}
Если же создать множество следующим образом:

myset = set('aaa bbbb cc')

print(myset)
то мы получим (порядок элементов может отличаться):

{' ', 'c', 'a', 'b'}
   Обратите внимание на наличие пробела в качестве элемента множества myset.

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

Приведенный ниже код:

myset1 = {1, 2, [5, 6], 7}    # множество не может содержать список
myset2 = {1, 2, {5, 6}, 7}    # множество не может содержать множество
приводит к ошибке:

TypeError: unhashable type: 'list'
TypeError: unhashable type: 'set'
Однако приведенный ниже код:

myset = {1, 2, (5, 6), 7}    # множество может содержать кортеж
работает как полагается.

Примечание 2. Документация по множествам доступна по ссылке.

'''
myset = set([1, 2, 3, '1', '2', '3'])
print(len(myset))