Найти в Дзене
Секреты python

Удаление дубликатов в списках. Сборник рецептов и алгоритмов.

Оглавление

Список (list)- это популярная структура для хранения данных, которая относится к изменяемому типу в языке python. Подробнее о типах данных можно прочитать здесь.

При работе со списками иногда возникает потребность в удалении дублирующих значений. Какие варианты возможны?

1. Сохранение одного экземпляра каждого объекта и удаление повторений.

1.1. Сохранение последнего дубликата и удаление предшествующих

Пример: [3,1,3,2,9,9] ->[1,3,2,9]

1.2. Сохранение первого дубликата и удаление последующих

Пример: [3,1,3,2,9,9] ->[3,1,2,9]

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

Пример: [3,1,3,2,9,9] ->[1,2]

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

1. Сохранение одного экземпляра каждого объекта и удаление повторений.

1.1. Без учета порядка расположения объектов в списке.

1.1.1. Через set()

x = [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9]

print(list(set(x)))

Результат: [1, 2, 3, 4, 5, 7, 8, 9]

Удаление дубликатов выполняется через функцию - конструктор для приведения набора значений к типу "множество" - set().

При использовании set() не гарантируется, что изначальный порядок следования значений в наборе данных сохранится.

1.1.2. С помощью NumPy и функции unique()

import numpy as np
x = [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9]
out = np.unique(x).tolist()
print(out)

Результат: [2, 3, 4, 7, 9, 10, 15, 18]

1.2. С учетом порядка расположения объектов.

1.2.1. Словарь.

1.2.1.1. Сохранение первого экземпляра дубликата и удаление последующих.

для версий python, начиная с 3.7

x = [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9]

out = list(dict.fromkeys(x))

print(out)

Результат: [10, 3, 15, 7, 9, 2, 4, 18]

для версий python до 3.7

from collections import OrderedDict
x = [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9]
out = list(OrderedDict.fromkeys(x))
print(out)

Результат: [10, 3, 15, 7, 9, 2, 4, 18]

1.2.1.2. Сохранение последнего экземпляра дубликата и удаление предыдущих.

-2

Алгоритм на примере версии python до 3.7

from collections import OrderedDict
x = [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9]
# поворачиваем список: конец - в начало
# [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9] - > [9, 2, 7, 18, 4, 10, 2, 9, 7, 15, 3, 10]
out = list(OrderedDict.fromkeys(x[::-1]))
# поворачиваем список обратно
print(x[::-1])

Результат: [3, 15, 10, 4, 18, 7, 2, 9]

1.2.2. Генератор + enumerate()

x = [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9]

out = [i for n, i in enumerate(x) if i not in x[:n]]

print(out)

Результат: [10, 3, 15, 7, 9, 2, 4, 18]

2. Удаление всех повторяющихся экземпляров и сохранение только уникальных.

2.1. Через Counter()

from collections import Counter
x = [10, 3, 15, 7, 9, 2, 10, 4, 18, 7, 2, 9]
out = [k for k,v in Counter(x).items() if v == 1]
print(out)

Результат: [3, 15, 4, 18]

Пожалуйста, поддержите канал подпиской или лайком.

Это будет стимулом для нас работать лучше.

#технологии #программированиенаpython

#питон #операторы #python3

#программированиедляначинающих #секреты