Перейти к содержимому

Как удалить повторяющиеся элементы в списке python

  • автор:

Удаление повторяющихся элементов из списка Python

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

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

Наиболее эффективный способ, реализующий удаление повторяющихся элементов из списка Python, основан на преобразовании типов данных: list -> set -> list . Суть этого способа заключается в том, что множество set не может содержать одинаковые элементы. Таким образом, при преобразовании списка во множество, дублирующиеся элементы исключаются.

Рассмотрим практический пример удаления повторяющихся элементов с помощью функции, преобразования во множество set() , после чего рассмотрим еще один способ, позволяющий исключить дубликаты из списка:

  • Удаление повторяющихся элементов из списка с помощью функции set()
  • Удаление дубликатов с использованием цикла for

Удаление повторяющихся элементов из списка Python с помощью set():

lst = [0, 1, 2, 3, 3, 2] lst = list(set(lst)) print(lst)

Вывод на экран:

[0, 1, 2, 3]
Пояснения к коду:

1. Сначала преобразуем список во множество с помощью функции set() . В качестве аргумента передаем функции set() исходный список lst=([0, 1, 2, 3, 3, 2]) . Так как множество в Python не может содержать одинаковые элементы, то в результате получим множество :

print(set([0, 1, 2, 3, 3, 2]))

Вывод на экран:

2. Так как в конечном итоге мы должны получить список без дубликатов, а на данном этапе мы имеем множество , то нам нужно преобразовать это множество в список. Это легко сделать с помощью функции list() :

print(list())

Вывод на экран:

[0, 1, 2, 3]

Кд удаления повторяющихся элементов из списка с помощью функции set() довольно прост и лаконичен, рекомендую удалять дубликаты из списка именно этим способом. Для сравнения рассмотрим еще один способ, который уже не так лаконичен, но по-прежнему прост:

Как удалить повторяющиеся элементы из списка Python с помощью цикла for:

lst = [0, 1, 2, 3, 3, 2] new_lst = [] for i in lst: if i not in new_lst: new_lst.append(i) print(new_lst)

Вывод на экран:

[0, 1, 2, 3]

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

Пояснения по коду:

1. В строке new_lst = [] мы создаем новый пустой список, в который в дальнейшем будем добавлять элементы из списка lst , предварительно осуществив проверку на дублирование.

2. В цикле for будем осуществлять перебор элементов списка lst : если текущий элемент i не найден в списке new_lst , то есть if i not in new_lst , то этот элемент добавляется в список new_list с помощью метода append() : new_lst.append(i) .

Таким образом, в результате выполнения представленного кода, на выходе мы имеем 2 списка: исходный список lst и новый список new_lst , который содержит те же элементы, что и список lst , но за исключением дубликатов. При этом порядок следования элементов сохраняется.

У нас появился Telegram-канал для изучающих Python! Присоединяйтесь: вместе «питонить» веселее! �� Ссылка на канал: «Кодим на Python!»

Удалить все дубликаты из списка. Python

Для удаления дубликатов из списка можно использовать функцию set(), которая автоматически удаляет все повторяющиеся элементы. Но если необходимо сохранить порядок элементов, можно использовать следующий код:

def remove_duplicates(lst):
«»»Удаляет дубликаты из списка, сохраняя порядок элементов.»»»
seen = set()
result = []
for item in lst:
if item not in seen:
seen.add(item)
result.append(item)
return result

В этой функции мы создаем пустое множество seen для отслеживания уже пройденных элементов и пустой список result для сохранения уникальных элементов в том же порядке, в котором они были в исходном списке. Затем мы проходимся по каждому элементу списка lst. Если элемент еще не встречался, мы добавляем его в множество seen и в список result. Если же элемент уже был встречен, мы его игнорируем. Наконец, мы возвращаем список result как результат функции.

Переписать другими словами
Написать сочинение по запросу
Или попробуйте другие режимы нейросети.

Сберегите свое время и избавьтесь от лишних копий в списке благодаря нашей нейросети. Наша онлайн-система удалит все дубликаты в несколько секунд, а вы сможете потратить свое время на более важные задачи. Наша нейросеть пишет текст, и использует современные методы машинного обучения, чтобы справиться с задачей на 100%. Безопасность и удобство использования гарантированы. Попробуйте уже сегодня и убедитесь сами!

Как удалить в списке значения, которые повторяются?

У меня есть код, он парсит данные и получает всегда список с значениями в которых повторяются начальные элементы, а потом идёт никнейм пользователя, хочу удалить повторяющиеся элементы, а оставить имя пользователя, в данном случае повторяющийся элемент это »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’]

  • Вопрос задан более года назад
  • 193 просмотра

Комментировать
Решения вопроса 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 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *