Множества (sets) - это неупорядоченные коллекции уникальных элементов. В множествах каждый элемент может встречаться только один раз, и порядок элементов не фиксирован.
Множества можно создавать несколькими способами:
# Пустое множество
пустое_множество = set()
print(пустое_множество) # Вывод: set()
# Множество с элементами
цвета = {"красный", "зеленый", "синий"}
print(цвета) # Вывод: {'красный', 'зеленый', 'синий'}
# Множество из списка (удаляет дубликаты)
числа = [1, 2, 2, 3, 3, 3, 4]
уникальные_числа = set(числа)
print(уникальные_числа) # Вывод: {1, 2, 3, 4}
# Множество из строки
буквы = set("программирование")
print(буквы) # Вывод: {'а', 'г', 'е', 'и', 'м', 'н', 'о', 'п', 'р', 'т'}
# Важно: {} создает пустой словарь, а не множество!
# пустое_множество = {} # Это словарь!
пустое_множество = set() # Это правильное пустое множество
Множества позволяют добавлять и удалять элементы:
# Создание множества
фрукты = {"яблоко", "банан", "груша"}
print(f"Исходное множество: {фрукты}")
# add() - добавление одного элемента
фрукты.add("апельсин")
print(f"После add('апельсин'): {фрукты}")
# update() - добавление нескольких элементов
фрукты.update(["киви", "манго", "ананас"])
print(f"После update(): {фрукты}")
# remove() - удаление элемента (вызывает ошибку, если элемента нет)
фрукты.remove("банан")
print(f"После remove('банан'): {фрукты}")
# discard() - удаление элемента (не вызывает ошибку, если элемента нет)
фрукты.discard("виноград") # Нет ошибки, даже если элемента нет
print(f"После discard('виноград'): {фрукты}")
# pop() - удаление и возврат случайного элемента
удаленный_фрукт = фрукты.pop()
print(f"Удален: {удаленный_фрукт}")
print(f"После pop(): {фрукты}")
# clear() - очистка множества
# фрукты.clear()
# print(f"После clear(): {фрукты}")
Множества поддерживают математические операции, такие как объединение, пересечение и разность:
# Два множества
четные = {2, 4, 6, 8, 10}
меньше_десяти = {1, 2, 3, 4, 5, 6, 7, 8, 9}
# Объединение (все элементы из обоих множеств)
объединение = четные | меньше_десяти # или четные.union(меньше_десяти)
print(f"Объединение: {объединение}")
# Пересечение (только общие элементы)
пересечение = четные & меньше_десяти # или четные.intersection(меньше_десяти)
print(f"Пересечение: {пересечение}")
# Разность (элементы из первого множества, которых нет во втором)
разность = четные - меньше_десяти # или четные.difference(меньше_десяти)
print(f"Разность четные - меньше_десяти: {разность}")
# Симметрическая разность (элементы, которые есть только в одном из множеств)
сим_разность = четные ^ меньше_десяти # или четные.symmetric_difference(меньше_десяти)
print(f"Симметрическая разность: {сим_разность}")
Множества имеют множество полезных методов:
# Множества для примеров
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# copy() - создание копии множества
копия = a.copy()
print(f"Копия множества a: {копия}")
# isdisjoint() - проверка, что множества не пересекаются
print(f"a и b не пересекаются: {a.isdisjoint(b)}") # False
print(f"a и {{7, 8}} не пересекаются: {a.isdisjoint({7, 8})}") # True
# issubset() - проверка, что одно множество является подмножеством другого
c = {1, 2}
print(f"c является подмножеством a: {c.issubset(a)}") # True
print(f"c <= a: {c <= a}") # True
# issuperset() - проверка, что одно множество является надмножеством другого
print(f"a является надмножеством c: {a.issuperset(c)}") # True
print(f"a >= c: {a >= c}") # True
# Множества для примеров
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
# intersection_update() - изменение множества на пересечение
a.intersection_update(b)
print(f"После intersection_update: {a}") # {3, 4}
# difference_update() - изменение множества на разность
a = {1, 2, 3, 4}
a.difference_update(b)
print(f"После difference_update: {a}") # {1, 2}
# symmetric_difference_update() - изменение множества на симметрическую разность
a = {1, 2, 3, 4}
a.symmetric_difference_update(b)
print(f"После symmetric_difference_update: {a}") # {1, 2, 5, 6}
# update() - изменение множества на объединение
a = {1, 2, 3, 4}
a.update(b)
print(f"После update: {a}") # {1, 2, 3, 4, 5, 6}
Неизменяемые множества (frozenset) похожи на обычные множества, но не могут быть изменены после создания:
# Создание frozenset
неизменяемое_множество = frozenset([1, 2, 3, 4, 5])
print(неизменяемое_множество) # frozenset({1, 2, 3, 4, 5})
# frozenset можно использовать как ключи в словарях
словарь = {
frozenset([1, 2]): "первые два числа",
frozenset([3, 4]): "вторые два числа"
}
print(словарь)
# Все операции, которые не изменяют множество, работают с frozenset
a = frozenset([1, 2, 3])
b = frozenset([3, 4, 5])
объединение = a | b
print(f"Объединение frozenset: {объединение}")
# Попытка изменить frozenset вызовет ошибку
# a.add(4) # AttributeError: 'frozenset' object has no attribute 'add'
Множества особенно полезны для задач, связанных с уникальностью и поиском:
# 1. Удаление дубликатов из списка
оценки = [5, 4, 5, 3, 4, 5, 2, 3]
уникальные_оценки = list(set(оценки))
print(f"Уникальные оценки: {уникальные_оценки}")
# 2. Поиск общих элементов
курс_python = {"Анна", "Борис", "Виктория", "Дмитрий"}
курс_web = {"Борис", "Елена", "Виктория", "Захар"}
# Студенты, записанные на оба курса
общие_студенты = курс_python & курс_web
print(f"Записаны на оба курса: {общие_студенты}")
# Студенты, записанные только на Python
только_python = курс_python - курс_web
print(f"Только на Python: {только_python}")
# 3. Проверка принадлежности
зарезервированные_слова = {
"if", "else", "for", "while", "def", "class", "import", "from"
}
def проверить_имя_переменной(имя):
if имя in зарезервированные_слова:
return False
return True
print(проверить_имя_переменной("my_var")) # True
print(проверить_имя_переменной("if")) # False
Задание 1:
# Множество дней недели
дни_недели = {
"понедельник", "вторник", "среда", "четверг",
"пятница", "суббота", "воскресенье"
}
# Проверка наличия дней
print(f"Содержится ли 'понедельник': {'понедельник' in дни_недели}")
print(f"Содержится ли 'праздник': {'праздник' in дни_недели}")
Задание 2:
def уникальные_элементы(список1, список2):
return set(список1) ^ set(список2) # Симметрическая разность
# Тестирование
a = [1, 2, 3, 4, 5]
b = [4, 5, 6, 7, 8]
print(f"Уникальные элементы: {уникальные_элементы(a, b)}")
Задание 3:
# Множества студентов по курсам
python_студенты = {"Анна", "Борис", "Виктория"}
web_студенты = {"Борис", "Григорий", "Дарья"}
# Добавление студента
python_студенты.add("Евгений")
print(f"Python студенты: {python_студенты}")
# Удаление студента
python_студенты.discard("Анна")
print(f"После удаления Анны: {python_студенты}")
# Студенты на обоих курсах
оба_курса = python_студенты & web_студенты
print(f"На обоих курсах: {оба_курса}")
Задание 4:
def является_подмножеством(множество1, множество2):
return множество1.issubset(множество2)
# Тестирование
a = {1, 2}
b = {1, 2, 3, 4}
print(f"{a} подмножество {b}: {является_подмножеством(a, b)}") # True
print(f"{b} подмножество {a}: {является_подмножеством(b, a)}") # False