Ответ
list
(список) и set
(множество) — это встроенные изменяемые коллекции в Python, но они служат разным целям и имеют фундаментальные различия.
Ключевые отличия:
-
Уникальность элементов
list
: Может содержать дубликаты.set
: Содержит только уникальные элементы. При добавлении дубликата он игнорируется.
-
Порядок элементов
list
: Упорядоченная коллекция. Элементы хранятся в порядке их добавления.set
: Неупорядоченная коллекция. Порядок элементов не гарантируется (хотя в современных версиях CPython он может сохраняться, на это нельзя полагаться).
-
Доступ к элементам
list
: Поддерживает индексацию и срезы (my_list[0]
,my_list[1:3]
).set
: Не поддерживает индексацию, так как элементы не упорядочены.
-
Производительность
list
: Проверка на вхождение элемента (x in my_list
) выполняется за линейное времяO(n)
, так как требует перебора элементов.set
: Проверка на вхождение (x in my_set
) выполняется за константное времяO(1)
в среднем, так какset
реализован на основе хеш-таблицы.
-
Типы элементов
list
: Может хранить элементы любых типов.set
: Может хранить только хешируемые (неизменяемые) типы данных, например,int
,str
,tuple
. Нельзя добавить вset
список или другойset
.
Пример:
# Исходные данные с дубликатами
data = [1, 'a', 2, 'a', 3, 1]
# Создание списка
my_list = list(data)
print(f"List: {my_list}") # -> List: [1, 'a', 2, 'a', 3, 1]
print(f"Первый элемент списка: {my_list[0]}") # -> 1
# Создание множества
my_set = set(data)
print(f"Set: {my_set}") # -> Set: {1, 2, 3, 'a'} (дубликаты удалены, порядок не гарантирован)
# Проверка производительности
# Для больших коллекций разница будет огромной
print(f"'a' in my_list: {'a' in my_list}") # O(n)
print(f"'a' in my_set: {'a' in my_set}") # O(1)
Когда что использовать:
list
: Когда важен порядок элементов, нужны дубликаты или доступ по индексу.set
: Когда нужно хранить только уникальные элементы, важна высокая скорость проверки на вхождение или для выполнения математических операций над множествами (объединение, пересечение).