Множества (Sets) в Python

PythonBeginner
Практиковаться сейчас

Введение

Добро пожаловать в эту лабораторную работу по множествам (Sets) в Python! Python предоставляет несколько встроенных типов данных для организации информации, включая списки (lists), словари (dictionaries), кортежи (tuples) и множества (sets).

Согласно официальной документации Python, множество — это неупорядоченная коллекция без повторяющихся элементов. Его основное применение — проверка принадлежности (membership testing) и удаление дубликатов.

В этой лабораторной работе вы изучите, как создавать множества, манипулировать ими и эффективно использовать их с помощью серии практических упражнений.

Инициализация множества

На этом шаге вы узнаете два основных способа создания множеств (sets) в Python: с использованием фигурных скобок {} и встроенной функции set(). Важно понимать, что использование пустых фигурных скобок {} создает пустой словарь (dictionary), а не пустое множество.

Примечание: Если вы не знакомы с использованием WebIDE (похожего на VS Code), пожалуйста, изучите это в этой лаборатории.

Сначала откройте файл step1.py в проводнике файлов слева.

Теперь скопируйте и вставьте следующий код в step1.py. Этот код демонстрирует, как создавать множества, и выделяет особый случай создания пустого множества.

## Create set using curly braces or set() function
s_braces = {1, 2, 3}
print(f"Set with braces: {s_braces}, type: {type(s_braces)}")

s_func = set([1, 2, 3])
print(f"Set with function: {s_func}, type: {type(s_func)}")

## Warning: empty {} creates a dictionary, not a set
s_dict = {}
print(f"Empty braces create a: {type(s_dict)}")

## To create an empty set, you must use set()
s_empty = set()
print(f"To create an empty set use set(): {type(s_empty)}")

Сохраните файл, а затем запустите его из терминала, выполнив следующую команду:

python3 step1.py

Вы должны увидеть следующий вывод, который подтверждает типы созданных объектов. Обратите внимание, что {} приводит к <class 'dict'>.

Set with braces: {1, 2, 3}, type: <class 'set'>
Set with function: {1, 2, 3}, type: <class 'set'>
Empty braces create a: <class 'dict'>
To create an empty set use set(): <class 'set'>

Понимание свойств множеств

На этом шаге вы изучите основные свойства множеств (sets). Множества мощны тем, что они автоматически обеспечивают уникальность элементов и являются неупорядоченными. Это означает, что множество автоматически удалит любые повторяющиеся значения, и вы не сможете получить доступ к его элементам по индексу.

Откройте файл step2.py.

Скопируйте и вставьте следующий код в step2.py. Первая часть кода демонстрирует, как обрабатываются дубликаты, а вторая часть показывает, что происходит при попытке индексации множества.

## Sets automatically remove duplicates
s_duplicates = {1, 2, 3, 2, 3, 4}
print(f"Original with duplicates: {{1, 2, 3, 2, 3, 4}}")
print(f"Set with duplicates removed: {s_duplicates}")

## Sets are unordered and cannot be indexed
print("\nAttempting to access a set by index...")
try:
    s = {1, 2, 3}
    s[0]
except TypeError as e:
    print(f"Error when indexing: {e}")

Теперь запустите скрипт из терминала:

python3 step2.py

Вывод будет следующим:

Original with duplicates: {1, 2, 3, 2, 3, 4}
Set with duplicates removed: {1, 2, 3, 4}

Attempting to access a set by index...
Error when indexing: 'set' object is not subscriptable

Как видите, дубликаты 2 и 3 были автоматически удалены. Попытка доступа к s[0] привела к TypeError, что подтверждает, что множества не поддерживают индексацию.

Добавление и обновление элементов

На этом шаге вы узнаете, как добавлять новые элементы в существующее множество. Python предоставляет для этого два основных метода: add() для добавления одного элемента и update() для добавления нескольких элементов из итерируемого объекта (iterable), такого как список или другое множество.

Откройте файл step3.py.

Скопируйте и вставьте следующий код в step3.py. Этот код сначала создаст множество, затем добавит один элемент, и, наконец, обновит его несколькими элементами.

## Start with a set
s = {1, 2, 3}
print(f"Original set: {s}")

## add() method: add a single element
s.add(4)
print(f"After adding 4: {s}")

## update() method: add multiple elements from an iterable
s.update([2, 3, 4, 5, 6])  ## Duplicates like 2, 3, 4 are ignored
print(f"After updating with [2, 3, 4, 5, 6]: {s}")

Выполните скрипт из терминала:

python3 step3.py

Ваш вывод должен выглядеть следующим образом. Обратите внимание, что при использовании update() любые элементы, которые уже присутствуют в множестве, просто игнорируются.

Original set: {1, 2, 3}
After adding 4: {1, 2, 3, 4}
After updating with [2, 3, 4, 5, 6]: {1, 2, 3, 4, 5, 6}

Удаление и отбрасывание элементов

На этом шаге вы узнаете о двух способах удаления элементов из множества: remove() и discard(). Хотя оба метода удаляют элемент, они ведут себя по-разному, если элемент не найден. Метод remove() вызовет исключение KeyError, которое может привести к сбою вашей программы, если его не обработать, тогда как discard() ничего не сделает и продолжит работу без ошибок.

Откройте файл step4.py.

Скопируйте и вставьте следующий код, который демонстрирует поведение обоих методов.

## remove() method: raises KeyError if element is not found
s = {1, 2, 3}
print(f"Original set: {s}")
s.remove(3)
print(f"After removing 3: {s}")

## Trying to remove an element that doesn't exist with remove()
try:
    s.remove(3)
except KeyError as e:
    print(f"Error when removing 3 again: KeyError: {e}")

## discard() method: does not raise an error if element is not found
s = {1, 2, 3}
print(f"\nNew original set: {s}")
s.discard(3)
print(f"After discarding 3: {s}")
s.discard(3) ## No error is raised
print(f"After discarding 3 again (no error): {s}")

Запустите скрипт из терминала:

python3 step4.py

Вывод наглядно демонстрирует разницу:

Original set: {1, 2, 3}
After removing 3: {1, 2}
Error when removing 3 again: KeyError: 3

New original set: {1, 2, 3}
After discarding 3: {1, 2}
After discarding 3 again (no error): {1, 2}

Выбор между remove() и discard() зависит от того, хотите ли вы, чтобы ваша программа явно завершалась с ошибкой при отсутствии элемента, или чтобы она корректно обрабатывала его отсутствие.

Операции с множествами

На этом заключительном шаге вы попрактикуетесь в выполнении наиболее распространенных операций над множествами. Эти операции позволяют мощно комбинировать и сравнивать множества. Вы будете использовать как синтаксис методов (например, s1.union(s2)), так и синтаксис операторов (например, s1 | s2).

  • Объединение (Union) (union() или |): Создает новое множество со всеми элементами из предоставленных множеств.
  • Пересечение (Intersection) (intersection() или &): Возвращает новое множество, содержащее только те элементы, которые общие для всех множеств.
  • Разность (Difference) (difference() или -): Возвращает новое множество с элементами, которые есть в первом множестве, но отсутствуют во втором.
  • Симметричная разность (Symmetric Difference) (symmetric_difference() или ^): Возвращает новое множество с элементами, которые есть либо в одном, либо в другом множестве, но не в обоих одновременно.

Откройте файл step5.py.

Скопируйте и вставьте следующий код для выполнения этих четырех операций над двумя тестовыми множествами.

s1 = {1, 2, 3}
s2 = {2, 3, 4}
print(f"s1 = {s1}")
print(f"s2 = {s2}\n")

## union() or |
## Returns a new set containing all items from both sets.
print(f"Union (s1 | s2): {s1.union(s2)}")

## intersection() or &
## Returns a new set containing items common to both sets.
s3 = {3, 4, 5}
print(f"Intersection (s1 & s2): {s1.intersection(s2)}")

## difference() or -
## Returns a new set containing items in the first set but not in the second.
print(f"Difference (s1 - s2): {s1.difference(s2)}")
print(f"Difference (s2 - s1): {s2.difference(s1)}")

## symmetric_difference() or ^
## Returns a new set with elements in either set, but not both.
print(f"Symmetric Difference (s1 ^ s2): {s1.symmetric_difference(s2)}")

Запустите скрипт из терминала:

python3 step5.py

Изучите вывод, чтобы понять результат каждой операции:

s1 = {1, 2, 3}
s2 = {2, 3, 4}

Union (s1 | s2): {1, 2, 3, 4}
Intersection (s1 & s2): {2, 3}
Difference (s1 - s2): {1}
Difference (s2 - s1): {4}
Symmetric Difference (s1 ^ s2): {1, 4}

Резюме

В этой лабораторной работе вы изучили основы множеств (sets) в Python. Вы начали с инициализации множеств с использованием фигурных скобок {} и функции set(), отметив важное различие при создании пустых множеств. Вы изучили основные свойства множеств: они неупорядочены и хранят только уникальные элементы. Вы практиковались в изменении множеств, добавляя элементы с помощью методов add() и update(), и удаляя их с помощью методов remove() и discard(), поняв ключевое различие между ними. Наконец, вы выполнили основные операции над множествами, включая объединение (|), пересечение (&), разность (-) и симметричную разность (^). Теперь у вас есть прочная основа для использования множеств для работы с коллекциями уникальных элементов в ваших программах на Python.