Какие элементы может хранить множество в Python?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Элементы множеств в Python
Множества (set) в Python могут хранить только неизменяемые (immutable) и хешируемые элементы. Это ключевое ограничение, которое отличает множества от других коллекций.
Какие типы можно добавить в множество
В множество можно добавлять:
1. Примитивные типы
my_set = {1, 2.5, "hello", True}
print(my_set) # {True, 2.5, "hello", 1}
- int, float, bool — целые числа, вещественные числа, булевы значения
- str — строки любой длины
- None — значение None
2. Кортежи (tuple)
Кортежи можно добавлять, если они содержат только хешируемые элементы:
s = {(1, 2), (3, 4)}
print(s) # {(1, 2), (3, 4)}
3. Frozenset — неизменяемое множество
fs = frozenset([1, 2, 3])
s = {fs, "hello"}
print(s) # {frozenset({1, 2, 3}), 'hello'}
4. Пользовательские классы
Если класс имеет реализованы hash() и eq(), объекты можно добавлять:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
def __hash__(self):
return hash((self.x, self.y))
def __eq__(self, other):
return self.x == other.x and self.y == other.y
p1 = Point(1, 2)
p2 = Point(1, 2)
s = {p1, p2}
print(len(s)) # 1
Что НЕЛЬЗЯ добавить в множество
1. Списки (list)
s = {[1, 2, 3]} # TypeError: unhashable type: 'list'
2. Словари (dict)
s = {{"a": 1}} # TypeError: unhashable type: 'dict'
3. Изменяемые объекты в целом
Множества используют хеширование для быстрого поиска, поэтому элементы не должны меняться.
4. Множества (set)
s = {{1, 2, 3}} # TypeError: unhashable type: 'set'
Хотя frozenset можно добавить.
Концепция хеширования
Для добавления в множество объект должен быть хешируемым — иметь функцию hash() и быть неизменяемым. Множества используют хеш для быстрого поиска элементов за O(1).
Практическое применение
# Удаление дубликатов
numbers = [1, 2, 2, 3, 3, 3, 4]
unique = set(numbers)
print(unique) # {1, 2, 3, 4}
# Быстрая проверка наличия
allowed_ids = {"user_1", "user_2", "user_3"}
if user_id in allowed_ids: # O(1) операция
print("Access granted")
Итого: множество хранит только неизменяемые, хешируемые элементы — int, float, str, tuple (с хешируемыми элементами), frozenset и пользовательские объекты с hash() и eq().