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

Ответ 18+ 🔞

А, слушай, смотри, вот эта вся хуйня про list и set в Python — это, блядь, как два брата-близнеца, но один упорядоченный зануда, а второй — уникальный, но абсолютно беспорядочный мудак. Ёпта, сейчас разложу.

Представь, у тебя есть куча всего: [1, 'a', 2, 'a', 3, 1]. Два раза единица, две буквы 'a' — бардак, пиздец.

Список (list) — это как твой старый чемодан, куда ты сваливаешь всё подряд в том порядке, как хреначишь. Засунул носки, потом зубную щётку, потом опять носки — так они там и лежат, в порядке поступления. Дубликаты? Да хоть десять пар носков! И главное — ты можешь тыкнуть пальцем и сказать: «Дай-ка мне вторую хуйню из чемодана» — это индексация, my_list[1]. Упорядоченно, но искать в нём что-то — это, блядь, O(n), то есть перерыть весь чемодан до дна. Заебашься.

Множество (set) — это, сука, как умная, но слегка ебнутая тётка-перфекционистка. Ты ей сваливаешь ту же кучу: «Вот, храни!». А она смотрит и начинает: «О, две единицы? Нахуй одну! Две буквы 'a'? Одна долой! Порядок? Какой, нахуй, порядок? Я складываю как бог на душу положит!». И на выходе: {1, 2, 3, 'a'}. Уникально, чисто, но попробуй попросить: «Дай мне первый элемент» — она тебе в ответ: «Какой, нахуй, первый? У меня нет первого!». Зато спроси: «А буква 'a' у тебя есть?» — и она, блядь, моментально, за O(1), из своих хеш-таблиц (это типа волшебных кармашков) её достаёт. Быстро, ебать!

# Вот смотри, наглядная хуйня
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}") # Ищет перебором, как слепой кот в помойке
print(f"'a' in my_set: {'a' in my_set}")   # Бац — и сразу нашла! Магия, ёпта!

Итог, Колян:

  • Юзай list, когда тебе важен порядок (как история сообщений), нужны повторы или ты любишь тыкать пальцем в элементы по индексу.
  • Юзай set, когда надо оставить только уникальное (убрать дубликаты из списка — list(set(my_list)), да), или когда надо быстро проверять, есть ли элемент в коллекции. Или для операций типа «найди общее у этих двух куч» (пересечение).

А, да, важный нюанс, блядь! В set можно пихать только неизменяемое (хешируемое): числа, строки, кортежи. А вот список или другое множество — низя, пидарас шерстяной, он изменяемый, хеш от него не посчитаешь. Запомни это, и всё будет пучком.