Как получить уникальные значения из списка в Python?

Ответ

В Python есть несколько способов получить уникальные значения из списка, каждый со своими особенностями.

Основные методы:

  1. Использование set() (самый быстрый, но порядок не сохраняется):

    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = list(set(my_list))
    # Результат: [1, 2, 3, 4] (порядок может быть любым)
  2. Использование dict.fromkeys() (сохраняет порядок, Python 3.7+):

    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = list(dict.fromkeys(my_list))
    # Результат: [1, 2, 3, 4] (порядок сохранён)
  3. Использование collections.OrderedDict (сохраняет порядок для старых версий Python):

    from collections import OrderedDict
    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = list(OrderedDict.fromkeys(my_list))
  4. Использование цикла (понятный, но менее эффективный):

    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = []
    for item in my_list:
        if item not in unique_list:
            unique_list.append(item)

Ключевые различия:

  • set() — самый производительный, но не гарантирует порядок элементов.
  • dict.fromkeys() — оптимальный выбор для Python 3.7+, так как сочетает хорошую производительность и сохранение порядка вставки.
  • Цикл с проверкой — самый медленный для больших списков из-за сложности O(n²).

В контексте SQL аналогичная операция выполняется с помощью ключевого слова DISTINCT в запросе SELECT.

Ответ 18+ 🔞

А, слушай, про уникальные значения в списках на Python! Ну, тут, блядь, как в жизни — вариантов дохуя, но все они с подвохом, ёпта.

Вот представь, у тебя список, как мешок с картошкой, а там одна и та же хрень повторяется. Надо отсеять эту муть. И способов — как говна за баней.

Основные приёмы, сука:

  1. Через set() — быстрее всех, но порядок накрывается медным тазом.

    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = list(set(my_list))
    # Может выдать [4, 1, 3, 2] — полный пиздец с порядком.

    Это как взорвать мешок динамитом — картошка вся вылетит, но хрен поймёшь, какая откуда. Зато быстро, ебать!

  2. Через dict.fromkeys() — хитрая жопа, порядок сохраняет (если Python 3.7 и новее).

    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = list(dict.fromkeys(my_list))
    # Выдаст [1, 2, 3, 4] — всё на своих местах, красота!

    Работает потому, что ключи в словаре уникальные, ёпта. Умно, блядь.

  3. Через collections.OrderedDict — для дедов, которые на Python 3.6 и старше сидят.

    from collections import OrderedDict
    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = list(OrderedDict.fromkeys(my_list))

    То же самое, но для старых версий, где обычный словарь мог порядок перепутать. Архаизм, но работает.

  4. Тупой цикл — понятно, но медленно, как ебнешься.

    my_list = [1, 2, 2, 3, 4, 4]
    unique_list = []
    for item in my_list:
        if item not in unique_list:
            unique_list.append(item)

    Это если ты совсем даун и хочешь всё контролировать. Для маленьких списков сойдёт, а для больших — терпения ноль ебать, будет тормозить, как черепаха в сиропе.

Короче, суть:

  • set() — скорость овердохуища, но порядок — хуй с горы. Если тебе похуй на последовательность — твой выбор.
  • dict.fromkeys() — золотая середина. И быстро, и порядок не ебёт. Для современного Питона — то, что надо.
  • Цикл — это для учебников или для случаев, когда мозгов не хватило на первые два способа. Сложность у него O(n²), то есть на больших данных он просто сдохнет.

А в SQL, кстати, аналогичная фигня делается через DISTINCT в запросе. Типа SELECT DISTINCT column_name FROM table_name;. Там уже база данных сама голову ломает, как это оптимизировать, а не ты.