Работа с множествами: создание set и frozenset в языке 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'}