Рубрики
Без рубрики

Удалить дубликаты элементов из списка в Python

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

Автор оригинала: Pankaj Kumar.

Удалить дубликаты элементов из списка в Python

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

Методы удаления дубликатов элементов из списка – Python

1. Использование итерации

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

Код показан ниже:

a = [2, 3, 3, 2, 5, 4, 4, 6]

b = []

for i in a:
    # Add to the new list
    # only if not present
    if i not in b:
        b.append(i)

print(b)

Выход

[2, 3, 5, 4, 6]

Один и тот же код может быть написан, используя понимание списка для уменьшения количества строк кода, хотя оно по существу то же самое, что и раньше.

a = [2 3, 4, 2, 5, 4, 4, 6]
b = []
[b.append(i) for i in a if i not in b]
print(b)

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

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

2. Использование набора ()

Простой и быстрый подход для удаления дубликатов элементов из списка в Python будет использовать встроенный Python Установить () Способ преобразования элементов списка в уникальный набор, следующий, который мы можем преобразовать его в список, теперь удаляемую все его дубликаты элементов.

first_list = [1, 2, 2, 3, 3, 3, 4, 5, 5, 6]

# Convert to a set first
set_list = set(first_list)

# Now convert the set into a List
print(list(set_list))

second_list = [2, 3, 3, 2, 5, 4, 4, 6]

# Does the same as above, in a single line
print(list(set(second_list)))

Выход

[1, 2, 3, 4, 5, 6]
[2, 3, 4, 5, 6]

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

3. Консервирующий заказ: используйте заказ

Если вы хотите сохранить заказ, пока вы удаляете дубликаты элементов из списка в Python, вы можете использовать ЗаказДикт класс от Коллекции модуль.

Более конкретно, мы можем использовать Underduddict.Fromkeys (Список) Для получения словаря, имеющего дублирующие элементы удалены, пока все еще поддерживая порядок. Затем мы можем легко легко Преобразовать его в список используя Список () метод.

from collections import OrderedDict

a = [2, 3, 3, 2, 5, 4, 4, 6]

b = list(OrderedDict.fromkeys(a))

print(b)

Выход

[2, 3, 5, 4, 6]

Примечание : Если у вас есть Python 3.7 Или позже мы можем использовать встроенные Dict.Fromkeys (список) вместо. Это также гарантирует заказ.

Как вы можете наблюдать, порядок действительно поддерживается, поэтому мы получаем тот же выход, что и в первом методе. Но это намного быстрее! Это рекомендуемое решение этой проблемы. Но для иллюстрации мы покажем вам пару подходов, чтобы удалить дубликаты элементов из списка в Python.

4. Использование list.Count ()

list.Count () Метод возвращает количество вхождений значения. Мы можем использовать его вместе с Удалить () Способ устранения любых дубликатов элементов. Но опять же, это делает не сохранить заказ.

Обратите внимание, что этот метод изменяет входной список на месте, поэтому изменения отражены там.

a = [0, 1, 2, 3, 4, 1, 2, 3, 5]

for i in a:
    if a.count(i) > 1:
        a.remove(i)

print(a)

Выход

[0, 4, 1, 2, 3, 5]

Все кажется хорошо, не так ли?

Но есть небольшая проблема с вышеуказанным кодом.

Когда мы итерация по поводу списка, используя петлю и удаление элемента одновременно, итератор пропускает один элемент. Итак, вывод кода зависит от элементов списка, и если вам повезет, вы никогда не получите проблему. Давайте понять этот сценарий простым кодом.

a = [1, 2, 3, 2, 5]

for i in a:
    if a.count(i) > 1:
        a.remove(i)
    print(a, i)

print(a)

Выход :

[1, 2, 3, 2, 5] 1
[1, 3, 2, 5] 2
[1, 3, 2, 5] 2
[1, 3, 2, 5] 5
[1, 3, 2, 5]

Вы можете видеть, что цикл для цикла выполняется всего в четыре раза, и он пропускает 3, следующий элемент после вызова удаления (). Если вы проходите список ввода в виде [1, 1, 1, 1], окончательный список будет [1, 1].

Итак, есть ли обходной путь?

Конечно, есть обходной путь. Используйте копию списка в LOOP, но удалите элементы из основного списка. Простой способ создания копии списка – нарезка. Вот код обновления, который будет работать нормально во всех случаях.

a = [1, 1, 1, 1]

for i in a[:]:  # using list copy for iteration
    if a.count(i) > 1:
        a.remove(i)
    print(a, i)

print(a)

Выход:

[1, 1, 1] 1
[1, 1] 1
[1] 1
[1] 1
[1]

5. Использование сортировки ()

Мы можем использовать Сортировать () Способ сортировки набора, который мы получили в приближении 2. Это также удалит какие-либо дубликаты, сохраняя при этом порядок, но медленнее, чем Dict.Fromkeys () подход.

a = [0, 1, 2, 3, 4, 1, 2, 3, 5]
b = list(set(a))
b.sort(key=a.index)
print(b)   

Выход

[0, 1, 2, 3, 4, 5]

6. Использование модуля PandaS

Если мы работаем с модулем Pandas, мы можем использовать pandas.drop_duxates () Способ удаления дубликатов и затем преобразовать его в список, а также сохраняя заказ.

import pandas as pd

a = [0, 1, 2, 3, 4, 1, 2, 3, 5]

pd.Series(a).drop_duplicates().tolist()

Выход

[0, 1, 2, 3, 4, 5]

Рекомендации