Удаление элементов, имеющих последовательные дубликаты
Меня заинтересовал вопрос: Устраните последовательные дубликаты элементов списка и как это должно быть реализовано в Python.
Вот что я придумал:
list = [1,1,1,1,1,1,2,3,4,4,5,1,2]i = 0while i < len(list)-1: if list[i] == list[i+1]: del list[i] else: i = i+1
Вывод:
[1, 2, 3, 4, 5, 1, 2]
Я думаю, это нормально.
Итак, мне стало любопытно, и я хотел посмотреть, смогу ли я удалить элементы, которые имели последовательные дубликаты, и получить этот результат:
[2, 3, 5, 1, 2]
Для этого я сделал это:
list = [1,1,1,1,1,1,2,3,4,4,5,1,2]i = 0dupe = Falsewhile i < len(list)-1: if list[i] == list[i+1]: del list[i] dupe = True elif dupe: del list[i] dupe = False else: i += 1
Но это кажется немного неуклюжим и не по-питоновски, есть ли у вас какой-нибудь более умный / элегантный / эффективный способ реализовать это?
Переведено автоматически
Ответ 1
>>> L = [1,1,1,1,1,1,2,3,4,4,5,1,2]>>> from itertools import groupby>>> [key for key, _group in groupby(L)][1, 2, 3, 4, 5, 1, 2]
Для второй части
>>> [k for k, g in groupby(L) if len(list(g)) < 2][2, 3, 5, 1, 2]
Если вы не хотите создавать временный список только для определения длины, вы можете использовать sum поверх выражения генератора
>>> [k for k, g in groupby(L) if sum(1 for i in g) < 2][2, 3, 5, 1, 2]
Ответ 2
Oneliner в чистом Python
[v for i, v in enumerate(your_list) if i == 0 or v != your_list[i-1]]
Ответ 3
Если вы используете Python 3.8+, вы можете использовать выражение присваивания :=:
:=
list1 = [1, 2, 3, 3, 4, 3, 5, 5]prev = object()list1 = [prev:=v for v in list1 if prev!=v]print(list1)
С принтами:
[1, 2, 3, 4, 3, 5]
Ответ 4
"Ленивым" подходом было бы использовать itertools.groupby.
itertools.groupby
import itertoolslist1 = [1, 2, 3, 3, 4, 3, 5, 5]list1 = [g for g, _ in itertools.groupby(list1)]print(list1)
выходные данные