J'étais curieux de la question: Éliminer les doublons consécutifs des éléments de liste , et comment il devrait être implémenté en Python.
Ce que j'ai trouvé, c'est ceci:
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
Production:
[1, 2, 3, 4, 5, 1, 2]
Je suppose que c'est ok.
Je suis donc devenu curieux et je voulais voir si je pouvais supprimer les éléments qui avaient des doublons consécutifs et obtenir cette sortie:
[2, 3, 5, 1, 2]
Pour cela, je l'ai fait:
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
Mais cela semble un peu maladroit et non pas Pythonic, avez-vous un moyen plus intelligent/plus élégant/plus efficace de mettre en œuvre cela?
>>> 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]
Si vous le souhaitez, vous pouvez utiliser la carte au lieu de la liste de compréhension
>>> from operator import itemgetter
>>> map(itemgetter(0), groupby(L))
[1, 2, 3, 4, 5, 1, 2]
Pour la deuxième partie
>>> [x for x, y in groupby(L) if len(list(y)) < 2]
[2, 3, 5, 1, 2]
Si vous ne voulez pas créer la liste temporaire juste pour prendre la longueur, vous pouvez utiliser sum sur une expression de générateur
>>> [x for x, y in groupby(L) if sum(1 for i in y) < 2]
[2, 3, 5, 1, 2]
Oneliner en Python pur
[v for i, v in enumerate(your_list) if i == 0 or v != your_list[i-1]]
Voici une solution sans dépendance vis-à-vis des packages externes:
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
Ensuite, j'ai remarqué que la solution similaire d'Ulf Aslak est plus propre :)
Un autre liner possible, utilisant functools.reduce
(à l'exclusion de l'importation) - avec l'inconvénient que la chaîne et la liste nécessitent des implémentations légèrement différentes:
>>> from functools import reduce
>>> reduce(lambda a, b: a if a[-1:] == [b] else a + [b], [1,1,2,3,4,4,5,1,2], [])
[1, 2, 3, 4, 5, 1, 2]
>>> reduce(lambda a, b: a if a[-1:] == b else a+b, 'aa bbb cc')
'a b c'
Pour Éliminer les doublons consécutifs des éléments de liste ; comme alternative, vous pouvez utiliser itertools.izip_longest()
avec compréhension de la liste comme:
>>> 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]