Как дублировать список на Python

Иногда на Python у нас есть список ценностей, среди которых есть и дубликаты.
Это каждодневный случай, чтобы удалить все дубликаты из списка, чтобы
все остальные значения в списке уникальны.
Мы можем достичь этого различными методами, некоторые из которых сохраняют
оригинальный порядок элементов, в то время как другие нет.
Дублировать список Python без сохранения порядка
Если это не является требованием для сохранения первоначального порядка,
мы можем вывести список, используя встроенную структуру данных set
.
set
- это структура данных, которая может содержать только уникальные элементы по дизайну.
Построив такой set
из нашего первоначального списка, все дублирующиеся элементы
игнорируются.
Затем мы можем преобразовать набор обратно в список и получим список уникальных элементов.
К сожалению, порядок элементов меняется, так как при дедупликации
функциональность структуры данных set
реализована с помощью хэш-таблиц, которые
не помните, какие элементы были вставлены первыми.
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique_set = set(names)
>>> unique_list = list(unique_set)
>>> unique_list
['Stacy', 'Sarah', 'Jim', 'Bob']
Если вы используете пакет NumPy для научных вычислений на Python,
вы также можете использовать функцию numpy.unique()
.
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> numpy.unique(names).tolist()
['Bob', 'Jim', 'Sarah', 'Stacy']
Обратите внимание, что вышеприведенный метод также не сохраняет порядок следования оригинальных элементов.
Сохраняющий порядок NumPy
способ более задействован, и вы можете найти его ниже.
Дублирование списка Python с сохранением ордера
Простым решением, позволяющим сохранить исходный порядок, является использование двойной петли для каждого.
Первый цикл проходит через все элементы исходного списка.
Второй цикл проверяет, не видели ли мы уже элемент с таким же значением.
Если нет, то мы добавляем его в список unique
, который, в конце концов,
будет содержать уникальные элементы в оригинальном порядке.
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = []
>>> for name in names: # 1st loop
... if name not in unique: # 2nd loop
... unique.append(name)
...
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Другой способ вычитания списка при сохранении исходного порядка - это использование
структура данных collection.OrderedDict
.
OrderedDict
- это особый вид структуры данных словаря на Python, который
помнит порядок вставки ключей.
>>> from collections import OrderedDict
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> unique = list(OrderedDict.fromkeys(names))
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Если вы используете Pandas библиотеку анализа данных Python,
pandas.unique
также могут быть полезны. Этот метод позволяет сохранить заказ.
>>> import pandas
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> pandas.unique(names).tolist()
['Bob', 'Stacy', 'Sarah', 'Jim']
Способ NumPy вычитать список при сохранении порядка немного сложнее.
Вы должны запомнить индекс каждого отдельного элемента, а затем воссоздать уникальный список.
от оригинала с использованием таких индексов.
>>> import numpy
>>> names = ['Bob', 'Stacy', 'Sarah', 'Jim', 'Stacy', 'Jim']
>>> _, indexes = numpy.unique(names, return_index=True)
>>> unique = [names[i] for i in numpy.sort(indexes)]
>>> unique
['Bob', 'Stacy', 'Sarah', 'Jim']
Сопутствующая статья - Python List
- В чем разница между списочными методами добавлять и расширять
- Как преобразовать список в струну на Python
- Как соединить два или несколько списков на Python
- В чем разница между делом, удалением и попаданием в списки Pythonа
- Как быстро проверить, существует ли значение в списке Python