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 добавлены операторы объединения (|), пересечения (&), разности (-) и симметрической разности (^) для множеств, которые теперь можно использовать с оператором присваивания (|=, &= и т.д.).
Расширенные примеры применения
Удаление дубликатов с сохранением порядка (используя словарь):
list_data = [3, 1, 2, 1, 4]
unique = list(dict.fromkeys(list_data))
print(unique)[3, 1, 2, 4]
Операции над множествами:
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}Проверка подмножества и надмножества:
a = {1, 2}
b = {1, 2, 3}
print(a.issubset(b))
print(b.issuperset(a))True True
Использование множества для фильтрации уникальных слов в тексте:
text = 'hello world hello python'
words = set(text.split())
print(words){'hello', 'world', 'python'}Множество как хеш-таблица для быстрой проверки принадлежности:
vip_ids = {1001, 1002, 1005}
check_id = 1002
print(check_id in vip_ids)True
Генератор множества (set comprehension):
squares = {x**2 for x in range(5)}
print(squares){0, 1, 4, 9, 16}Множество из пользовательских объектов, если они хешируемы (определены __hash__ и __eq__):
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