Удаление элементов, которые имеют последовательные дубликаты - PullRequest
32 голосов
/ 21 апреля 2011

Меня интересовал вопрос: Устранить последовательные дубликаты элементов списка и то, как это должно быть реализовано в 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

Но это кажется неуклюжим и не пифоническим, есть ли у вас умнее / элегантнее/ более эффективный способ реализовать это?

Ответы [ 4 ]

51 голосов
/ 21 апреля 2011
>>> L = [1,1,1,1,1,1,2,3,4,4,5,1,2]
>>> from itertools import groupby
>>> [x[0] for x in groupby(L)]
[1, 2, 3, 4, 5, 1, 2]

Если вы хотите, вы можете использовать карту вместо понимания списка

>>> from operator import itemgetter
>>> map(itemgetter(0), groupby(L))
[1, 2, 3, 4, 5, 1, 2]

Для второй части

>>> [x for x, y in groupby(L) if len(list(y)) < 2]
[2, 3, 5, 1, 2]

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

>>> [x for x, y in groupby(L) if sum(1 for i in y) < 2]
[2, 3, 5, 1, 2]
14 голосов
/ 27 октября 2017

Oneliner в чистом Python

[v for i, v in enumerate(your_list) if i == 0 or v != your_list[i-1]]
1 голос
/ 19 апреля 2019

Вот решение вне зависимости от внешних пакетов:

list = [1,1,1,1,1,1,2,3,4,4,5,1,2] 
L = list + [999]  # append a unique dummy element to properly handle -1 index
[l for i, l in enumerate(L) if l != L[i - 1]][:-1] # drop the dummy element

Тогда я заметил, что подобное решение Ульфа Аслака чище:)

0 голосов
/ 13 декабря 2016

К Устранить последовательные дубликаты элементов списка ;в качестве альтернативы вы можете использовать itertools.izip_longest() с списком как:

>>> from itertools import izip_longest

>>> my_list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
>>> [i for i, j in izip_longest(my_list, my_list[1:]) if i!=j]
[1, 2, 3, 4, 5, 1, 2]
...