Вопрос-Ответ

Removing elements that have consecutive duplicates

Удаление элементов, имеющих последовательные дубликаты

Меня заинтересовал вопрос: Устраните последовательные дубликаты элементов списка и как это должно быть реализовано в Python.

Вот что я придумал:

list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
i = 0

while 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 = 0
dupe = False

while 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.

import itertools

list1 = [1, 2, 3, 3, 4, 3, 5, 5]
list1 = [g for g, _ in itertools.groupby(list1)]
print(list1)

выходные данные

[1, 2, 3, 4, 3, 5]
python list