Чем отличаются list и set в Python?

Ответ

list (список) и set (множество) — это встроенные изменяемые коллекции в Python, но они служат разным целям и имеют фундаментальные различия.

Ключевые отличия:

  1. Уникальность элементов

    • list: Может содержать дубликаты.
    • set: Содержит только уникальные элементы. При добавлении дубликата он игнорируется.
  2. Порядок элементов

    • list: Упорядоченная коллекция. Элементы хранятся в порядке их добавления.
    • set: Неупорядоченная коллекция. Порядок элементов не гарантируется (хотя в современных версиях CPython он может сохраняться, на это нельзя полагаться).
  3. Доступ к элементам

    • list: Поддерживает индексацию и срезы (my_list[0], my_list[1:3]).
    • set: Не поддерживает индексацию, так как элементы не упорядочены.
  4. Производительность

    • list: Проверка на вхождение элемента (x in my_list) выполняется за линейное время O(n), так как требует перебора элементов.
    • set: Проверка на вхождение (x in my_set) выполняется за константное время O(1) в среднем, так как set реализован на основе хеш-таблицы.
  5. Типы элементов

    • 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: Когда нужно хранить только уникальные элементы, важна высокая скорость проверки на вхождение или для выполнения математических операций над множествами (объединение, пересечение).