Список (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. Сохранение последнего экземпляра дубликата и удаление предыдущих.
Алгоритм на примере версии 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
#программированиедляначинающих #секреты