Set: примеры (PYTHON)

Изучение функции set в Python на примерах
Раздел: Встроенные функции, Создание коллекций
set([iterable]): set

Описание функции set

Функция set() в Python создает объект множества. Множество - это неупорядоченная коллекция уникальных хешируемых элементов. Основные применения: удаление дубликатов из последовательности, проверка принадлежности элемента, выполнение математических операций над множествами (объединение, пересечение и т.д.).

Функция принимает один необязательный аргумент:

  • iterable (опционально) - итерируемый объект (например, список, кортеж, строка). Элементы должны быть хешируемыми (неизменяемыми типами: числа, строки, кортежи). Если аргумент не указан, возвращается пустое множество.

Возвращаемое значение - новое множество, содержащее уникальные элементы из переданного итерируемого объекта. Если передана не итерируемая сущность или элементы нехешируемы, возникает исключение TypeError.

Множества являются изменяемыми, но сами элементы внутри множества должны быть неизменяемыми. Для создания множества также можно использовать фигурные скобки {}, но пустое множество создается только через set().

Простые примеры использования

Создание пустого множества:

s = set()
print(type(s))
<class 'set'>

Создание множества из списка с дубликатами:

list_data = [1, 2, 2, 3, 4]
s = set(list_data)
print(s)
{1, 2, 3, 4}

Создание множества из строки:

s = set('hello')
print(s)
{'h', 'e', 'l', 'o'}

Создание множества из кортежа:

t = (5, 6, 7, 7)
s = set(t)
print(s)
{5, 6, 7}

Использование неизменяемого множества frozenset в качестве элемента:

fs = frozenset([1, 2])
s = set([fs, 3])
print(s)
{frozenset({1, 2}), 3}

Похожие функции в Python

frozenset() - создает неизменяемое множество, которое можно использовать как ключ словаря или элемент другого множества. Пример: f = frozenset([1, 2]).

Литерал множества {} - используется для создания множества с заранее известными элементами. Пример: s = {1, 2, 3}. Пустое множество так создать нельзя - это создаст словарь.

dict.fromkeys() - может имитировать создание множества из последовательности, но возвращает словарь с уникальными ключами и значениями None. Пример: d = dict.fromkeys([1, 2, 2]) возвращает {1: None, 2: None}.

Предпочтительнее использовать set() для конвертации итерируемых объектов или создания пустого множества. Литерал {} удобен для явного перечисления элементов. frozenset() применяется, когда требуется неизменяемость.

Аналоги функции в других языках

JavaScript: объект Set. Создание: let s = new Set([1, 2, 2]);. Результат: Set {1, 2}.

PHP: массив можно использовать как множество через array_unique. Пример: $s = array_unique([1, 2, 2]);. Результат: [1, 2].

Java: HashSet<Integer> set = new HashSet<>(Arrays.asList(1, 2, 2));. Результат: [1, 2] (порядок не гарантируется).

C#: HashSet<int> set = new HashSet<int>() { 1, 2, 2 };. Результат: коллекция с элементами 1 и 2.

Golang: нет встроенного множества; используется map[T]bool. Пример: set := map[int]bool{1: true, 2: true}.

Kotlin: setOf(1, 2, 2) возвращает неизменяемое множество [1, 2].

SQL: концепция множеств реализована через операторы UNION, INTERSECT, EXCEPT в запросах.

Lua: нет встроенного множества; используются таблицы с уникальными ключами.

Отличия от Python: в некоторых языках множества упорядочены (JavaScript Set сохраняет порядок вставки), в других - нет. В Python множество не гарантирует порядок элементов до версии 3.7, но в современных реализациях порядок вставки сохраняется.

Типичные ошибки

Передача нехешируемых элементов (например, списков):

s = set([1, [2, 3]])
TypeError: unhashable type: 'list'

Создание пустого множества через фигурные скобки (создается словарь):

s = {}
print(type(s))
<class 'dict'>

Попытка использовать множество как аргумент для set() без преобразования (бесполезная операция):

s = {1, 2}
t = set(s)  # Создается копия множества
print(t)
{1, 2}

Ожидание порядка элементов в старых версиях Python (до 3.7 порядок не гарантировался):

s = set([3, 1, 2])
print(s)  # В Python 3.6 может вывести {1, 2, 3}
{1, 2, 3}

Изменения в последних версиях Python

Начиная с Python 3.7, множество сохраняет порядок вставки элементов как деталь реализации CPython. В Python 3.6 это также наблюдалось, но не было гарантировано. Спецификация языка не требует сохранения порядка, но на практике в современных версиях (3.7+) порядок поддерживается.

В Python 3.9 добавлены операторы объединения (|), пересечения (&), разности (-) и симметрической разности (^) для множеств, которые теперь можно использовать с оператором присваивания (|=, &= и т.д.).

Расширенные примеры применения

Удаление дубликатов с сохранением порядка (используя словарь):

Пример python
list_data = [3, 1, 2, 1, 4]
unique = list(dict.fromkeys(list_data))
print(unique)
[3, 1, 2, 4]

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

Пример python
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b)  # Объединение
print(a & b)  # Пересечение
print(a - b)  # Разность
print(a ^ b)  # Симметрическая разность
{1, 2, 3, 4, 5}
{3}
{1, 2}
{1, 2, 4, 5}

Проверка подмножества и надмножества:

Пример python
a = {1, 2}
b = {1, 2, 3}
print(a.issubset(b))
print(b.issuperset(a))
True
True

Использование множества для фильтрации уникальных слов в тексте:

Пример python
text = 'hello world hello python'
words = set(text.split())
print(words)
{'hello', 'world', 'python'}

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

Пример python
vip_ids = {1001, 1002, 1005}
check_id = 1002
print(check_id in vip_ids)
True

Генератор множества (set comprehension):

Пример python
squares = {x**2 for x in range(5)}
print(squares)
{0, 1, 4, 9, 16}

Множество из пользовательских объектов, если они хешируемы (определены __hash__ и __eq__):

Пример python
class Item:
    def __init__(self, id):
        self.id = id
    def __hash__(self):
        return hash(self.id)
    def __eq__(self, other):
        return self.id == other.id

items = {Item(1), Item(2), Item(1)}
print(len(items))
2

питон set function comments

En
Set Create mutable set