Дубликаты в списках в Питоне
У меня периодически всплывает вопрос: как в Питоне удалить в списке дублирующиеся элементы (из [1, 2, 2, 3] получить [1, 2, 3] ). Я знаю один способ-хак:
lst = dict([(item, None) for item in lst]).keys()
Здесь создается словарь из элементов списка в качестве ключей. Поскольку ключи в словаре уникальные, добавление дублирующих ключей ничего не меняет. Ну и потом просто берется получившийся список ключей словаря.
Я его назвал хаком, потому что он использует, в общем-то, побочный эффект от совершенно бесполезного преобразования данных, и при чтении кода это сразу не транслируется мозгом в «удалить дубликаты». Не говоря уж о том, что данные эти несколько раз копируются.
Так вот, не знает ли кто какой-нибудь способ поэлегантней?
Комментарии: 11
Konstantin
Почему бы не воспользоваться set: lst = set(lst) или: lst = list(set(lst)) Работает только в python >=2.4, если я не ошибаюсь.
Иван Сагалаев
О, множества — это интересно! Спасибо. Хотя тоже вариант не на все случаи, потому что порядок не схраняют. Как, впрочем, и способ через dict.
Grigoriy Petukhov
Python Cookbook от О’Рейли — неплохая книженция.
В частности, там есть рецепты по удалению дубликатов из списков. Далее код.
Порядок не сохраняется:
# support 2.3 as well as 2.4 try: set except NameError: from sets import Set as set def unique(s): """ Return a list of the elements in s in arbitrary order, but without duplicates. """ # Try using a set first, because it's the fastest and will usually work try: return list(set(s)) except TypeError: pass # Move on to the next method # Since you can't hash all elements, try sorting, to bring equal items # together and then weed them out in a single pass t = list(s) try: t.sort( ) except TypeError: del t # Move on to the next method else: # the sort worked, so we're fine -- do the weeding return [x for i, x in enumerate(t) if not i or x != t[i-1]] # Brute force is all that's left u = [ ] for x in s: if x not in u: u.append(x) return u
Порядок сохраняется:
# support 2.3 as well as 2.4 try: set except NameError: from sets import Set as set # f defines an equivalence relation among items of sequence seq, and # f(x) must be hashable for each item x of seq def uniquer(seq, f=None): """ Keeps earliest occurring item of each f-defined equivalence class """ if f is None: # f's default is the identity function f(x) -> x def f(x): return x already_seen = set( ) result = [ ] for item in seq: marker = f(item) if marker not in already_seen: already_seen.add(marker) result.append(item) return result
>>> d = [1, 1, 2, 2, 3, 3] >>> list(set(d)) [1, 2, 3]
Способы удаления дубликатов из списка в Python
Удаление дубликатов списка достаточно простая задача. При этом, знание ее вариантов имеет большое практическое значение. И в сегодняшней статье мы рассмотрим варианты получения уникального списка элементов из исходной последовательности. И рассмотрим варианты реализации.
Наивный метод.
В наивном методе мы просто проходим по списку и добавляем первое вхождение элемента в новый список, игнорируя все остальные вхождения этого конкретного элемента.
# Код демонстрирует удаление дубликатов
# из списка наивным методом
# инициализация списка
my_list = [1, 3, 5, 6, 3, 5, 6, 1]
print («Оригинальный список : » + str(my_list))
# используем наивный метод
# чтобы убрать дубликаты
# из списка
li = []
for i in my_list:
if i not in li:
li.append(i)
# список после удаления дубликатов
print («список после удаления дубликатов : » + str(li))
Оригинальный список : [1, 3, 5, 6, 3, 5, 6, 1]
список после удаления дубликатов : [1, 3, 5, 6]
Использование генератора списков.
Данный метод аналогичен предыдущему, но использует запись в виде одной строки, с использованием генератора списков.
# Код демонстрирует удаление дубликатов
# из списка с помощью генератора списков
# инициализация списка
my_list = [1, 3, 5, 6, 3, 5, 6, 1]
print («Оригинальный список : » + str(my_list))
# используем генератор списка
# чтобы удалить дубликаты
li = []
[li.append(x) for x in my_list if x not in li]
# вывод списка после удаления элементов
print («Список после удаления дубликатов : » + str(li))
Оригинальный список : [1, 3, 5, 6, 3, 5, 6, 1]
список после удаления дубликатов : [1, 3, 5, 6]
Использование set().
Это самый популярный способ, с помощью которого дубликаты удаляются из списка. Но главным и заметным недостатком этого подхода является то, что в этом конкретном методе порядок элементов теряется.
# Код Python3 показывает как
# удалять дубликаты из списка методом set()
# инициализация списка
my_list = [1, 5, 3, 6, 3, 5, 6, 1]
print («Оригинальный список : » + str(my_list))
# используем set()
# чтобы удалить дубликаты из списка
my_list = list(set(my_list))
# вывод списка после удаления элементов
# не сохраняет порядок
print («Список после удаления дубликатов: » + str(my_list))
Оригинальный список : [1, 5, 3, 6, 3, 5, 6, 1]
Список после удаления дубликатов: [1, 3, 5, 6]
Генератор списка + enumarate().
Генератор списка в сочетании с функцией перечисления также может решить эту задачу. Он ищет уже существующие элементы и пропускает их добавление. Также сохраняет порядок списка.
# Код Python3 показывает как удалять дубликаты из списка
# используя генератор списков(list comprehension) + enumerate()
# инициализация списка
my_list = [1, 5, 3, 6, 3, 5, 6, 1]
print («Оригинальный список : » + str(my_list))
# используем list comprehension + enumerate()
# чтобы удалить дубликаты из списка
li = [i for n, i in enumerate(my_list) if i not in my_list[:n]]
# вывод списка после удаления элементов
print («Список после удаления дубликатов: » + str(li))
Оригинальный список : [1, 5, 3, 6, 3, 5, 6, 1]
Список после удаления дубликатов: [1, 5, 3, 6]
Модуль collections.OrderedDict.fromkeys().
Это самый быстрый метод для достижения конкретной задачи. Сначала он удаляет дубликаты и возвращает словарь, который необходимо преобразовать в список. Он также хорошо работает и в случае строк.
# Код Python3 показывает как удалять дубликаты из списка
# с помощью collections.OrderedDict.fromkeys()
from collections import OrderedDict
# инициализация списка
my_list = [1, 5, 3, 6, 3, 5, 6, 1]
print («Оригинальный список : » + str(my_list))
# используем модуль collections.OrderedDict.fromkeys()
# чтобы удалить дубликаты из списка
# вывод списка после удаления элементов
print («Список после удаления дубликатов: » + str(li))
Оригинальный список : [1, 5, 3, 6, 3, 5, 6, 1]
Список после удаления дубликатов: [1, 5, 3, 6]
Таким образом, для получения списка из уникальных элементов в Python, применимы все вышеуказанные методы. Но при этом встроенный модуль collections минимизирует скорость выполнения задачи.

![]()
Создано 21.09.2021 10:33:00
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
- Кнопка:
Она выглядит вот так: - Текстовая ссылка:
Она выглядит вот так: Как создать свой сайт - BB-код ссылки для форумов (например, можете поставить её в подписи):
Комментарии ( 0 ):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2023 Русаков Михаил Юрьевич. Все права защищены.
Списки в Python

Введение в генераторы списков Генераторы списков являются мощным и компактным инструментом в Python, позволяющим создавать списки с помощью однострочных выражений.


При работе с данными в Python, часто возникает необходимость удалить дубликаты из списка. Дубликаты могут исказить результаты анализа данных, повторяющиеся


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


Добавление элемента в начало списка является распространенной операцией при работе с данными в Python. В некоторых случаях порядок элементов имеет значение


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


Python — это язык программирования, который предоставляет множество встроенных функций и методов для работы со списками. Функции и методы списков


Введение Списки в Python — это универсальная структура данных, которая позволяет хранить и организовывать коллекции элементов. Списки являются одним


Python предоставляет удобные средства для работы со списками, включая вычисление среднего арифметического элементов списка. Среднее арифметическое —


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


Python — это высокоуровневый язык программирования, который часто используется для работы со списками. При выводе списков в Python по умолчанию скобки
Как можно посчитать количество одинаковых элементов в списке Python
Продолжаем разговаривать про списки в Python и про то как с ними работать, я сторонник того что информация в небольших объемах воспринимается и усваивается намного лучше, поэтому и пишу небольшие статьи их можно даже назвать заметками. Сегодня поговорим о том как можно посчитать количество одинаковых элементов в списке. Делается это достаточно просто, в принципе как и все в языке программирования Python) Для решения этой задачи потребуется метод count(). Рассмотрим его применение на самом простом примере.
Поиск и подсчет количества одинаковых элементов в списке
И так допустим у нас есть какой-то список, и нам бы очень хотелось не только найти одинаковые элементы но и посчитать их количество.
numbers = [1, 2, 5, 55, 68, 88, 89,1, 2, 5, 55, 68, 88, 891, 2, 5, 55, 68, 88, 89,]
print(numbers)
Список состоит из цифр и выглядит следующим образом.

Для того чтобы посчитать количество одинаковых элементов нужно дописать всего одну строчку. Создать переменную в которую с помощью метода count будет помещаться количество найденных одинаковых элементов, для того чтобы увидеть результат выведем его на экран.
numbers = [1, 2, 5, 55, 68, 88, 89,1, 2, 5, 55, 68, 88, 891, 2, 5, 55, 68, 88, 89,] print(numbers) conunt = numbers.count(int('2')) print(conunt)
Проверим результат, как видим все правильно цифра «2» встречается в нашем списке «3» раза.

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