Работа с set в Python: полное руководство с примерами

Раздел: Структуры данных -> Структуры данных

Множества в Python: базовые операции и варианты использования

Множество (set) в Python представляет неупорядоченную коллекцию уникальных элементов. Оно пригодится для проверки вхождения, удаления дубликатов и выполнения математических операций над наборами данных. Основной способ создания - использование литерала {} с элементами или вызов set(). Пустой литерал {} создаёт словарь, поэтому пустое множество задаётся через set().

Типичные операции: add() добавляет один элемент, update() - несколько, remove() удаляет элемент (вызывает ошибку при отсутствии), discard() - без ошибки, pop() - удаляет случайный элемент. Для проверки наличия элемента используется оператор in. Математические операции: union() (|), intersection() (&), difference() (-), symmetric_difference() (^).

# Создание множества
my_set = {1, 2, 3, 'a', (4, 5)}
print(my_set)  # неупорядоченный вывод

# Добавление и удаление
my_set.add(4)
my_set.discard(2)
print(4 in my_set)  # True

# Математические операции
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)  # {1, 2, 3, 4, 5}
print(a & b)  # {3}

значения списка числа python (итерация по значениям списка чисел в python)

{'a', 1, 2, 3, (4, 5)}
True
{1, 2, 3, 4, 5}
{3}

словарь set python (словарь и set в python)

Цели использования: фильтрация уникальных значений, быстрая проверка членства (средняя сложность O(1)), операции теории множеств для обработки данных. Ограничения: элементы должны быть хешируемыми (неизменяемыми), поэтому списки или словари в set поместить нельзя.

Как создать множество из списка или строки?

Преобразование коллекций в set происходит функцией set(). Это отбрасывает дубликаты.

numbers = [1, 2, 2, 3, 4, 4]
unique = set(numbers)
print(unique)

text = 'hello'
letters = set(text)
print(letters)

Python dict set (словарь и множество в python)

{1, 2, 3, 4}
{'o', 'e', 'l', 'h'}

типы структур python (типы структур данных в python)

Важно: порядок элементов не сохраняется, строки превращаются в набор неповторяющихся символов.

Как убрать дубликаты из списка, сохранив порядок?

Простое преобразование в set теряет порядок. Для сохранения последовательности при удалении дубликатов можно использовать dict.fromkeys() или цикл с промежуточным set:

items = [3, 1, 2, 1, 3, 5]
unique_ordered = list(dict.fromkeys(items))
print(unique_ordered)

# Альтернатива с сохранением порядка через set
seen = set()
result = []
for item in items:
    if item not in seen:
        seen.add(item)
        result.append(item)
print(result)

кортеж чисел python (кортеж чисел в python)

[3, 1, 2, 5]
[3, 1, 2, 5]

язык программирования python массивы (массивы (списки) в python)

Как использовать set comprehension для генерации множества?

Set comprehension позволяет создавать множество на основе итерации с условием:

squares = {x**2 for x in range(1, 6)}
print(squares)

even_squares = {x**2 for x in range(1, 11) if x % 2 == 0}
print(even_squares)

массивы данных python 3 (массивы данных в python)

{1, 4, 9, 16, 25}
{4, 16, 36, 64, 100}

последовательности в python и способы их реализации (последовательности в python и способы их реализации)

Этот способ элегантно заменяет цикл for с add().

Как создать неизменяемое множество (frozenset)?

frozenset - это хешируемый, неизменяемый аналог set. Его можно использовать в качестве ключа словаря или элемента другого множества:

fs = frozenset([1, 2, 3, 2])
print(fs)
# fs.add(4)  # AttributeError, так как frozenset не имеет add

# Использование в качестве ключа
d = {frozenset({1, 2}): "value"}
print(d)

# Множество из frozenset-ов
set_of_sets = {frozenset({1}), frozenset({2, 3})}
print(set_of_sets)

программы с массивами на python (программы с массивами на python)

frozenset({1, 2, 3})
{frozenset({1, 2}): 'value'}
{frozenset({2, 3}), frozenset({1})}

Python пар (пары (ключ-значение) в python)

Полезно, когда требуется вложенность множеств.

Как проверить, является ли одно множество подмножеством другого?

Методы issubset() (<=), issuperset() (>=) и операторы сравнения:

A = {1, 2, 3}
B = {1, 2, 3, 4, 5}
print(A.issubset(B))  # True
print(B.issuperset(A))  # True
print(A < B)  # True (строгое подмножество)
print(B > A)  # True
print(A == {3, 2, 1})  # True (равенство не зависит от порядка)

Python разница списков (разница между списками и кортежами в python)

True
True
True
True
True

Типичные ошибки при работе с set:

  • TypeError: unhashable type. Возникает при попытке добавить в set изменяемый объект (список, словарь, другое множество). Решение: использовать frozenset для вложенных множеств или кортежи вместо списков.
  • KeyError при использовании remove() с отсутствующим элементом. Используйте discard(), если уверены, что элемент может отсутствовать.
  • Неупорядоченность. Множество не гарантирует порядок элементов, поэтому не стоит полагаться на последовательность при итерации. Для упорядоченного множества используйте collections.OrderedDict или внешние библиотеки.
  • Путаница с пустым литералом. {} создаёт пустой словарь, а не множество. Всегда проверяйте тип.
- Python массив int (массив целых чисел в python)
- Python набор значений (множество (set) значений в python)

Расширенные примеры работы с множествами в Python

Симметрическая разность и её применение

Симметрическая разность (^) возвращает элементы, входящие только в одно из множеств. Это может быть полезно для выявления расхождений в двух наборах данных.

Пример
A = {'Alice', 'Bob', 'Charlie'}
B = {'Bob', 'Diana', 'Eve'}
unique_users = A ^ B
print('Уникальные пользователи одной системы:', unique_users)

# Альтернатива через symmetric_difference()
print(A.symmetric_difference(B))
Уникальные пользователи одной системы: {'Alice', 'Charlie', 'Diana', 'Eve'}
{'Alice', 'Charlie', 'Diana', 'Eve'}

Использование set для проверки анаграмм

Сравнение множеств символов позволяет быстро определить, состоят ли строки из одинаковых уникальных букв (без учёта частоты). Для строгой проверки анаграмм нужна сортировка или Counter, но set подходит для проверки совпадения набора символов.

Пример
def same_chars(s1, s2):
    return set(s1.lower()) == set(s2.lower())

print(same_chars("listen", "silent"))  # True
print(same_chars("hello", "world"))   # False
True
False

Множество как часть алгоритма поиска пересечений списков

Нахождение общих элементов в нескольких списках с помощью set.intersection эффективнее вложенных циклов.

Пример
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7]
list3 = [5, 8, 9]
common = set(list1) & set(list2) & set(list3)
print('Элементы есть во всех списках:', common)

# Или динамически
sets = [set(list1), set(list2), set(list3)]
common_dynamic = sets[0].intersection(*sets[1:])
print(common_dynamic)
Элементы есть во всех списках: {5}
{5}

Группировка по хешу с помощью frozenset

Когда требуется сгруппировать элементы по набору признаков, frozenset может быть ключом в словаре.

Пример
data = [
    {'fruit': 'apple', 'color': 'red'},
    {'fruit': 'banana', 'color': 'yellow'},
    {'fruit': 'apple', 'color': 'green'},
    {'fruit': 'banana', 'color': 'yellow'}
]
groups = {}
for item in data:
    key = frozenset(item.items())
    groups.setdefault(key, []).append(item)

for k, v in groups.items():
    print(dict(k), '->', len(v), 'записей')
{'fruit': 'apple', 'color': 'red'} -> 1 записей
{'fruit': 'banana', 'color': 'yellow'} -> 2 записей
{'fruit': 'apple', 'color': 'green'} -> 1 записей

Использование set для фильтрации стоп-слов

Быстрая проверка вхождения в множество стоп-слов ускоряет обработку текста.

Пример
stop_words = {'и', 'в', 'на', 'с', 'по', 'для', 'а', 'но', 'или', 'из'}
text = "яблоко и груша лежат на столе"
filtered_words = [word for word in text.split() if word.lower() not in stop_words]
print(' '.join(filtered_words))
яблоко груша лежат столе

Сравнение производительности set vs список для проверки in

Для большого количества проверок set значительно быстрее списка.

Пример
import time

data_set = set(range(100000))
data_list = list(range(100000))

start = time.perf_counter()
for i in range(10000):
    _ = i + 50000 in data_set
end = time.perf_counter()
print('set time:', end - start)

start = time.perf_counter()
for i in range(10000):
    _ = i + 50000 in data_list
end = time.perf_counter()
print('list time:', end - start)
set time: 0.0032
list time: 1.5421

(результаты могут отличаться в зависимости от системы, но разница будет существенной)

Множества для дедупликации вложенных кортежей

Кортежи хешируемы, поэтому их можно использовать внутри set.

Пример
pairs = [(1, 2), (2, 1), (1, 2), (3, 4)]
unique_pairs = set(pairs)
print(unique_pairs)
{(1, 2), (2, 1), (3, 4)}

Операции с множествами для настройки прав доступа

Моделирование разрешений с помощью set упрощает проверку и объединение ролей.

Пример
user_perms = {'read', 'write'}
required_perms = {'read', 'execute'}
if required_perms.issubset(user_perms):
    print('Доступ разрешён')
else:
    missing = required_perms - user_perms
    print('Не хватает прав:', missing)
Не хватает прав: {'execute'}

Множество (set) значений в Python - comments

En
Python набор значений (python)