Existe um embutido que remove duplicatas da lista em Python, enquanto preserva a ordem? Eu sei que posso usar um conjunto para remover duplicados, mas isso destrói a ordem original. Eu também sei que eu posso enrolar o meu assim:
def uniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
return output
(Graças a desenrolar para aquela amostra de código).
Mas I'gostaria de aproveitar um idioma embutido ou mais Pythonic, se possível.
Pergunta relacionada: Em Python, qual é o algoritmo mais rápido para remover duplicatas de uma lista para que todos os elementos sejam únicos enquanto preserva a ordem?
Aqui você tem algumas alternativas: http://www.peterbe.com/plog/uniqifiers-benchmark
O mais rápido:
def f7(seq):
seen = set()
seen_add = seen.add
return [x for x in seq if not (x in seen or seen_add(x))]
Por que atribuir seen.add
a seen_add
em vez de apenas chamar seen.add
? Python é uma linguagem dinâmica, e resolver seen.add
cada iteração é mais cara do que resolver uma variável local. O seen.add
poderia ter mudado entre iterações, e o tempo de execução é'não é inteligente o suficiente para descartar isso. Para jogá-lo com segurança, ele tem que verificar o objeto a cada vez.
Se você planeja usar muito esta função no mesmo conjunto de dados, talvez você esteja melhor com um conjunto ordenado: http://code.activestate.com/recipes/528878/
O(1) inserção, exclusão e verificação de membro por operação.
(Pequena nota adicional: seen.add()
sempre retorna Nenhum
, então o ou
acima só existe como uma forma de tentar uma atualização do conjunto, e não como uma parte integrante do teste lógico).
from itertools import groupby
[ key for key,_ in groupby(sortedList)]
A lista não'nem sequer tem de ser sorted, a condição suficiente é que os valores iguais sejam agrupados.
Editar: Eu assumi que "preservando a ordem" implica que a lista está realmente ordenada. Se este não for o caso, então a solução da MizardX é a correta.
Comunidade editar: Esta é, no entanto, a forma mais elegante de " comprimir elementos consecutivos duplicados num único elemento".