Что такое множества в Python?

Множества (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
неизменяемое_множество = 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. Создайте множество с названиями дней недели. Добавьте в него выходные дни и проверьте, содержатся ли в множестве определенные дни.
  2. Напишите функцию, которая находит уникальные элементы в двух списках с использованием множеств.
  3. Создайте программу для работы с множеством студентов: добавление, удаление, поиск студентов по курсам.
  4. Реализуйте функцию, которая проверяет, является ли одно множество подмножеством другого.
Решения:

Задание 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
Предыдущий урок Следующий урок