Работа с множествами: создание set и frozenset в языке Python

Раздел: Основы Python -> Работа со структурами данных

Создание множеств в Python

В Python множество (set) представляет неупорядоченную коллекцию уникальных хешируемых элементов. Рассмотрим все способы создания set и неизменяемого frozenset, включая типичные ошибки.

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

Наиболее компактный способ - использование фигурных скобок {} с перечислением элементов через запятую. Так создаётся множество сразу с заданными значениями.

numbers = {1, 2, 3, 4, 5}
print(numbers)  # {1, 2, 3, 4, 5}

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

Этот метод подходит, когда все элементы известны заранее. Порядок элементов не гарантирован.

Типичная ошибка:

Попытка создать пустое множество через {} приводит к созданию пустого словаря, а не множества.

wrong = {}
print(type(wrong))  # 

Python добавить ключ (добавление ключа в словарь в python)

Для пустого множества следует использовать конструктор set().

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

Используйте конструктор set() без аргументов:

empty_set = set()
print(empty_set)      # set()
print(len(empty_set)) # 0

Python добавить в множество (добавление элемента в множество в python)

Это единственный корректный способ получения пустого множества.

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

Передайте итерируемый объект (список, строку, кортеж, range, файл и т. д.) в set(). Дубликаты будут автоматически удалены.

# Из списка
numbers = set([1, 2, 2, 3, 4])
print(numbers)  # {1, 2, 3, 4}

# Из строки
unique_letters = set('hello')
print(unique_letters)  # {'h', 'e', 'l', 'o'} (порядок произвольный)

# Из кортежа
vowels = set(('a', 'e', 'i', 'o', 'u'))
print(vowels)  # {'a', 'e', 'i', 'o', 'u'}

# Из range
small = set(range(5))
print(small)  # {0, 1, 2, 3, 4}

создание множества python (создание множества (set) в python)

Возможная проблема:

Элементы итерируемого объекта должны быть хешируемыми (неизменяемыми). Если передать список, содержащий другой список, возникнет TypeError: unhashable type: 'list'.

bad_set = set([[1, 2], [3, 4]])  # TypeError

создание словаря в python (создание словаря в python)

Как создать множество с помощью генератора (set comprehension)?

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

# Квадраты чисел от 0 до 9
squares = {x**2 for x in range(10)}
print(squares)  # {0, 1, 4, 9, 16, 25, 36, 49, 64, 81}

# Чётные числа от 1 до 20
evens = {x for x in range(1, 21) if x % 2 == 0}
print(evens)    # {2, 4, 6, 8, 10, 12, 14, 16, 18, 20}

создание массивов python (создание списков/массивов в python)

Такой подход удобен для быстрого преобразования или фильтрации данных.

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

frozenset - неизменяемый аналог set. Его можно использовать как ключ словаря или элемент другого множества. Создаётся через конструктор frozenset().

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

# Использование как ключа словаря
d = {fs: 'неизменяемое множество'}
print(d)  # {frozenset({1, 2, 3}): 'неизменяемое множество'}

Ограничения:

После создания frozenset нельзя добавить или удалить элементы. Он не поддерживает методы add(), remove() и т. д.

Расширенные примеры создания множеств

Создание из map и filter

Можно комбинировать map() или filter() с конструктором set для преобразования данных.

Пример
# Преобразование строк в числа и удаление дубликатов
strings = ['10', '20', '10', '30', '20']
numbers_set = set(map(int, strings))
print(numbers_set)  # {10, 20, 30}

# Фильтрация положительных чисел
data = [1, -2, 3, -4, 5]
positive = set(filter(lambda x: x > 0, data))
print(positive)  # {1, 3, 5}

Создание frozenset из set

Можно создать frozenset из существующего set для защиты от изменений.

Пример
s = {1, 2, 3}
fs = frozenset(s)
print(fs)  # frozenset({1, 2, 3})
# s.add(4) - теперь s изменится, но fs останется прежним

Создание множества из нескольких источников (объединение)

Хотя это не прямое создание, но можно сформировать новое множество через оператор | (объединение) или метод union().

Пример
a = {1, 2, 3}
b = {3, 4, 5}
c = a | b
print(c)  # {1, 2, 3, 4, 5}

# Или через * для распаковки элементов других множеств
combined = {*a, *b}
print(combined)  # {1, 2, 3, 4, 5}

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

Пример
# Длины уникальных слов в предложении
text = "Python set создание множество set"
words = text.split()
lengths = {len(word) for word in words}
print(lengths)  # {4, 3, 6, 8}

Создание множества с помощью цикла (менее идиоматично)

Хотя лучше использовать comprehension, для понимания можно показать явный цикл:

Пример
result = set()
for i in range(1, 6):
    result.add(i * 2)
print(result)  # {2, 4, 6, 8, 10}

Создание frozenset из строки методом frozenset()

Пример
fs = frozenset('abracadabra')
print(fs)  # frozenset({'a', 'b', 'r', 'c', 'd'})

Создание множества из значений словаря

Пример
d = {'x': 1, 'y': 2, 'z': 1}
unique_vals = set(d.values())
print(unique_vals)  # {1, 2}

Создание множества из списка, содержащего None и другие типы

Пример
mixed = [1, 'a', None, 1.5, (1,2), None]
s = set(mixed)
print(s)  # {1, 'a', None, 1.5, (1, 2)}

Создание множества с помощью генератора из файла (строки)

Пример
# Предположим, файл 'data.txt' содержит строки:
# apple
# banana
# apple
with open('data.txt', 'r') as f:
    unique_lines = {line.strip() for line in f}
print(unique_lines)  # {'apple', 'banana'}

Создание множества (set) в Python - comments

En
создание множества python (python)