Как убрать одинаковые элементы массива python
Удаляем одинаковые элементы из через создание множества. Множество отличается от списка тем, что любой элемент может быть представлен в нём только один раз:
nums = [1, 2, 3, 8, 9, 1, 8, 8, 9] list(set(nums)) # [1, 2, 3, 8, 9]
Убрать одинаковые элементы из массива можно также перебирая все элементы в цикле:
nums = [1, 2, 3, 8, 9, 1, 8, 8, 9] result = [] for num in nums: if num not in result: result.append(num) print(result) # => [1, 2, 3, 8, 9]
Способы удаления дубликатов из списка в 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-2024 Русаков Михаил Юрьевич. Все права защищены.
Как удалить в списке значения, которые повторяются?
У меня есть код, он парсит данные и получает всегда список с значениями в которых повторяются начальные элементы, а потом идёт никнейм пользователя, хочу удалить повторяющиеся элементы, а оставить имя пользователя, в данном случае повторяющийся элемент это »https://www.instagram.com/’:
all_urls=follow_url.find_elements_by_tag_name('li') i=[i.find_element_by_tag_name('a').get_attribute('href') for i in all_urls] print(i)
в итоге я получаю простой список: [‘https://www.instagram.com/green_delux/’, ‘https://www.instagram.com/sweet_apple_krd/’] и мне нужно убрать всё лишнее и оставить такой исход: [‘green_delux’, ‘sweet_apple_krd’]
- Вопрос задан более года назад
- 200 просмотров
Комментировать
Решения вопроса 1
преобразовать list в set , в сете останутся только уникальные элементы (тк не все функции могут принимать set вместо list, можно на всякий случай преобразовать снова в тип «список»)
но тут не набор уникальных элементов нужен, а обрезать всё, что после инстаграмма. Если именно так, то, зная, где резать, можно в каждом элементе в генераторе списка отбрасывать первые 26 символов и последний
i=[i.find_element_by_tag_name('a').get_attribute('href')[26:-1] for i in all_urls]
Удаление одинаковых элементов в отсортированном листе (списке)
Например, у меня есть лист x = [a, a, a, f, h, k, k] . Мне надо сделать, что бы в этом листе было только одно a и одно k , т.е. удалить лишние похожие элементы, остальные не трогать. Похожие элементы всегда рядом, т.к. лист просортирован. Как реализовать удаление этих лишних элементов?
Отслеживать
52.3k 11 11 золотых знаков 108 108 серебряных знаков 312 312 бронзовых знаков
задан 9 окт 2016 в 13:32
722 1 1 золотой знак 6 6 серебряных знаков 20 20 бронзовых знаков
11 окт 2016 в 20:50
ассоциация: stackoverflow.com/questions/89178/…
2 мар 2017 в 13:41
7 ответов 7
Сортировка: Сброс на вариант по умолчанию
Можно использовать модуль itertools:
from itertools import groupby x = ['a', 'a', 'a', 'f', 'h', 'k', 'k'] new_x = [el for el, _ in groupby(x)] print(new_x) # ['a', 'f', 'h', 'k']
Способ лучше варианта с set тем, что itertools.groupby сохраняет тот порядок, в котором элементы шли в изначальной последовательности. В то время, как set не гарантирует сохранения порядка.
Отслеживать
ответ дан 9 окт 2016 в 15:03
20.4k 4 4 золотых знака 25 25 серебряных знаков 52 52 бронзовых знака
Оптимальный вариант
9 окт 2016 в 15:17
только я ю делал это через itertools.Counter
9 окт 2016 в 19:53
способ сработает только для предварительного отсортированного списка
10 окт 2016 в 10:54
@vadimvaduxa В вопросе указано, что список отсортирован
10 окт 2016 в 12:20
даже рецепт есть готовый: unique_justseen() : map(itemgetter(0), groupby(‘aaafhkk’)) см. more_itertools пакет
11 окт 2016 в 20:46
Проще всего так:
>>> l = [1, 1, 2, 3, 3, 5] >>> print list(set(l)) [1, 2, 3, 5] >>>
Отсортирован ли изначальный список, значения не имеет. Однако, способ не универсален, например:
>>> l = [1, 1, 2, 3, 3, [4, 5, 6]] >>> print list(set(l)) Traceback (most recent call last): File "", line 1, in TypeError: unhashable type: 'list'
def f(l): n = [] for i in l: if i not in n: n.append(i) return n print f([1, 1, 2, 3, 3, [4, 5, 6]]) # [1, 2, 3, [4, 5, 6]] print f([[1, 2], [1, 2], 3, 4, 4, 'oops', 'oops']) # [[1, 2], 3, 4, 'oops']
Если (как в условии) входящий список так или иначе отсортирован, в последнем алгоритме (функция f) вместо
if i not in n: n.append(i)
if not n or i != n[-1]: n.append(i)
что существенно улучшит эффективность.
Отслеживать
ответ дан 9 окт 2016 в 13:35
7,461 14 14 серебряных знаков 31 31 бронзовый знак
способ совсем не универсален, тк работает только для вложенности первого порядка
10 окт 2016 в 10:55
@vadimvaduxa . print f([[1, [2]], [1, [2]], 3, 4, 4, ‘oops’, ‘oops’]) —> [[1, [2]], 3, 4, ‘oops’]
10 окт 2016 в 18:31
set(L) не гарантирует сохранения порядка, если хочется его сохранить, то можно OrderedDict.fromkeys(L) использовать. Функция f() квадратична ( O(n**2) ), можно groupby(sorted(L)) использовать ( O(n log n) ), если элементы нехэшируемые. Иллюстрация: если n миллион, то квадратичный алгоритм требует порядка 1000_000_000_000 операций, а O(n log n) только порядка 10_000_000 (если ввод задачи не ограничен условиями, то полезно следить за трудоёмкостью алгоритма (по порядку величины)).
11 окт 2016 в 21:39
import itertools x = 2, 2, 4, 3, 3, 1, 1, 2, 5, 4, 2, 1 print('data1:', x) # простой спрособ - set, но теряется сортировка исходного списка r = set(x) print('set:', r) # способ groupby подходит не совсем, тк уникальны только элементы идущие подряд r = [a[0] for a in itertools.groupby(x)] print('неверно groupby no sort:', r) r = set(a[0] for a in itertools.groupby(x)) print('верно groupby no sort:', r) # если список сначала отсортировать r = [a[0] for a in itertools.groupby(sorted(x))] print('groupby sort:', r) # способ при котором не теряется сортировка исходного списка def unique(obj: iter): args = [] for a in obj: if a not in args: args.append(a) yield a r = unique(x) print('original sort unique:', *r) # если список вложенный и заранее неизвесна степень вложенности x = 2, (2, 4), [3], [3, [1, [1, 2, ([5],)], [4]], 2, 1] print('\ndata2:', x) def unpack(obj: iter): for o in obj: if isinstance(o, (list, tuple)): yield from unpack(o) else: yield o r = unique(unpack(x)) print('unpack', *r)
data1: (2, 2, 4, 3, 3, 1, 1, 2, 5, 4, 2, 1) set: неверно groupby no sort: [2, 4, 3, 1, 2, 5, 4, 2, 1] верно groupby no sort: groupby sort: [1, 2, 3, 4, 5] original sort unique: 2 4 3 1 5 data2: (2, (2, 4), [3], [3, [1, [1, 2, ([5],)], [4]], 2, 1]) unpack 2 4 3 1 5