Добро пожаловать на тринадцатый урок нашего курса по программированию на Python! В предыдущем уроке мы сделали общий обзор коллекций в Python. Теперь пришло время подробно разобраться с множествами (set), которые позволяют хранить уникальные элементы и выполнять с ними различные операции.
В данную статью добавлены ссылки на GitHub в каждом примере. Также общая ссылка на GitHub для данного урока:
Что такое множество в Python?
Множество (set) — это неупорядоченная коллекция уникальных элементов.
- Неупорядоченная — порядок элементов в множестве не гарантируется.
- Уникальные элементы — один и тот же элемент не может появиться в множестве несколько раз.
Примеры использования множеств:
- Хранение уникальных идентификаторов (ID) или тегов.
- Удаление дубликатов из последовательности.
- Выполнение операций пересечения, объединения и разности над наборами данных (например, проверка общих элементов).
Создание множества.
Пустое множество:
# Создание пустого множества
empty_set = set()
print(empty_set) # set()
Обратите внимание: Использовать фигурные скобки {} с пустым содержимым нельзя — это будет интерпретировано как пустой словарь ({}).
Множество с элементами:
# Создание множества с элементами
numbers = {1, 2, 3, 4, 5}
print(numbers) # {1, 2, 3, 4, 5}
Преобразование списка или кортежа в множество:
# Преобразование списка в множество (для удаления дубликатов)
list_of_items = [1, 2, 2, 3, 4, 4, 5]
print(type(list_of_items)) # <class 'list'>
unique_items = set(list_of_items)
print(unique_items) # {1, 2, 3, 4, 5}
print(type(unique_items)) # <class 'set'>
Основные операции с множествами.
Добавление элемента:
numbers = {1, 2, 3}
numbers.add(4)
print(numbers) # {1, 2, 3, 4}
Удаление элемента:
- remove() — удаляет элемент, если он существует, иначе возбуждает ошибку KeyError.
- discard() — удаляет элемент, если он существует, иначе ничего не делает.
numbers = {1, 2, 3, 4}
numbers.remove(4)
print(numbers) # {1, 2, 3}
numbers.discard(5) # не вызовет ошибку, элемент 5 не существует
print(numbers) # {1, 2, 3}
Метод pop():
Метод pop() удаляет и возвращает произвольный элемент множества (поскольку оно неупорядоченное).
numbers = {1, 2, 3, 4}
popped_element = numbers.pop()
print(popped_element) # 1
print(numbers) # {2, 3, 4}
Очистка множества:
numbers = {1, 2, 3, 4}
numbers.clear()
print(numbers) # set()
Операции над множествами.
Множества в Python поддерживают множество операций, напоминающих классические математические действия.
Объединение (union):
Объединение двух множеств возвращает множество, содержащее все элементы из обоих множеств.
- Использование метода set1.union(set2)
- Использование оператора |
A = {1, 2, 3}
B = {3, 4, 5}
# Объединение с методом union()
union_set = A.union(B)
print(union_set) # {1, 2, 3, 4, 5}
# Объединение с оператором |
union_set_op = A | B
print(union_set_op) # {1, 2, 3, 4, 5}
Пересечение (intersection):
Пересечение двух множеств возвращает множество, содержащее общие элементы обоих множеств.
- Использование метода set1.intersection(set2)
- Использование оператора &
A = {1, 2, 3}
B = {2, 3, 4}
intersection_set = A.intersection(B)
print(intersection_set) # {2, 3}
intersection_set_op = A & B
print(intersection_set_op) # {2, 3}
Разность (difference):
Разность множеств возвращает те элементы, которые есть в одном множестве, но отсутствуют в другом.
- Использование метода set1.difference(set2)
- Использование оператора -
A = {1, 2, 3}
B = {2, 3, 4}
diff_set = A.difference(B)
print(diff_set) # {1}
diff_set_op = A - B
print(diff_set_op) # {1}
Симметрическая разность (symmetric_difference):
Симметрическая разность возвращает элементы, которые принадлежат ровно одному из множеств, но не обоим сразу.
- Использование метода set1.symmetric_difference(set2)
- Использование оператора ^
A = {1, 2, 3}
B = {2, 3, 4}
sym_diff_set = A.symmetric_difference(B)
print(sym_diff_set) # {1, 4}
sym_diff_set_op = A ^ B
print(sym_diff_set_op) # {1, 4}
Сравнение множеств.
Подмножество и надмножество:
- Подмножество: A.issubset(B) или A <= B возвращают True, если все элементы A содержатся в B.
- Надмножество: A.issuperset(B) или A >= B возвращают True, если все элементы B содержатся в A.
A = {1, 2}
B = {1, 2, 3}
print(A.issubset(B)) # True
print(B.issuperset(A)) # True
print(A <= B) # True
print(B >= A) # True
Равенство множеств:
Два множества считаются равными, если содержат одинаковые элементы, вне зависимости от порядка.
A = {1, 2, 3}
B = {3, 1, 2}
print(A == B) # True
Frozenset — неизменяемое множество.
Frozenset — это неизменяемый вариант множества.
- Нельзя добавлять или удалять элементы.
- Можно использовать как ключ в словаре или элемент другого множества.
fs = frozenset([1, 2, 3])
print(fs) #
frozenset({1, 2, 3})
fs.add(4) # Ошибка, так как frozenset неизменяемый
Практические примеры.
Пример 1. Удаление дубликатов из списка.
numbers_with_duplicates = [1, 2, 2, 3, 4, 4, 4, 5]
unique_numbers = set(numbers_with_duplicates)
print(unique_numbers) # {1, 2, 3, 4, 5}
Пример 2. Объединение тегов.
article_tags = {"python", "programming", "tutorial"}
new_tags = {"python", "development", "code"}
all_tags = article_tags.union(new_tags)
print(all_tags) # {'python', 'programming', 'tutorial', 'development', 'code'}
Пример 3. Поиск общих студентов в двух списках.
group1 = {"Иван", "Мария", "Петр"}
group2 = {"Мария", "Анна", "Сергей"}
common_students = group1 & group2
print(common_students) # {'Мария'}
Заключение тринадцатого урока.
Сегодня мы:
- Изучили, что такое множества (set) в Python.
- Узнали, как создавать и модифицировать множества.
- Рассмотрели основные операции: объединение, пересечение, разность, симметрическая разность.
- Познакомились с неизменяемым множеством (frozenset).
Множества полезны в ситуациях, когда вам нужно хранить уникальные элементы и быстро проверять, присутствует ли элемент в коллекции, либо выполнять операции над наборами данных, схожие с математическими. Понимание множеств даст вам дополнительную гибкость при решении разнообразных задач.
Домашняя работа.
Задание 1: Уникальные слова.
Напишите программу, которая принимает строку от пользователя, разбивает её на слова и выводит уникальные слова в алфавитном порядке.
Подсказка:
- Приведите строку к нижнему регистру.
- Используйте split() для разделения на слова.
- Удалите знаки препинания при необходимости.
- Преобразуйте результат в множество, затем обратно в список для сортировки.
Задание 2: Общие элементы.
Напишите программу, которая:
- Просит у пользователя ввести список чисел через запятую (строка).
- Преобразует их в множество.
- Дает возможность ввести ещё один список чисел (также строкой).
- Выводит пересечение множеств (общие элементы).
Задание 3*: Анализ пересекающихся тегов.
Создайте два множества, каждое из которых содержит теги (слова) для статей.
- Выведите пересечение тегов (теги, которые встречаются в обеих статьях).
- Выведите теги, которые встречаются только в одной из статей (симметрическая разность).
- Выведите объединение всех тегов.
Вопросы для самопроверки.
- Что такое множество в Python и чем оно отличается от списка?
- Как удалить дубликаты из списка?
- Для чего используется неизменяемое множество (frozenset)?
- Какие операции над множествами вы знаете и в чем их суть?
- Можно ли использовать операцию индексации [i] для множества и почему?
Свои домашние работы отправляйте на почтовый ящик homework@kuzinobit.com.
Поздравляю с успешным освоением тринадцатого урока! Теперь вы уверенно можете работать с множествами и применять их в своих программах.
В следующем уроке мы рассмотрим deque (двустороннюю очередь) из модуля collections — это полезная структура данных, которая позволяет эффективно добавлять и удалять элементы с обоих концов. Также затронем некоторые аспекты итераторных протоколов и посмотрим, как их можно использовать вместе с deque для более гибких операций над данными.
Друзья, ставьте свои лайки и подписывайтесь на канал. Дальше будет только интереснее! До новых встреч!