Como remover duplicatas de lista Python e manter a ordem? [duplicado]
Pergunta
Esta questão já tem uma resposta aqui:
Dada uma lista de strings, quero classificá-lo em ordem alfabética e remover duplicatas. Eu sei que posso fazer isso:
from sets import Set
[...]
myHash = Set(myList)
mas eu não sei como recuperar os membros da lista a partir do hash em ordem alfabética.
Eu não estou casado com o hash, portanto, qualquer maneira de realizar este trabalho. Além disso, o desempenho não é um problema, então eu preferiria uma solução que é expressa em código claramente para um rápido mas mais opaca.
Outras dicas
Se a sua entrada já está ordenada, então pode haver uma maneira mais simples de fazê-lo:
from operator import itemgetter
from itertools import groupby
unique_list = list(map(itemgetter(0), groupby(yourList)))
Se você quiser manter a ordem da lista original, é só usar OrderedDict com None
como valores.
Em python2:
from collections import OrderedDict
from itertools import izip, repeat
unique_list = list(OrderedDict(izip(my_list, repeat(None))))
Em Python3 é ainda mais simples:
from collections import OrderedDict
from itertools import repeat
unique_list = list(OrderedDict(zip(my_list, repeat(None))))
Se você não gosta iterators (zip e repetição) você pode usar um gerador (funciona tanto em 2 e 3):
from collections import OrderedDict
unique_list = list(OrderedDict((element, None) for element in my_list))
Se a sua clareza que você está depois, em vez de velocidade, eu acho que isso é muito claro:
def sortAndUniq(input):
output = []
for x in input:
if x not in output:
output.append(x)
output.sort()
return output
de O (n ^ 2) que, com o uso repetido de não por cada elemento da lista de entrada.
> mas eu não sei como recuperar os membros da lista a partir do hash em ordem alfabética.
Não é realmente a sua pergunta principal, mas para referência futura resposta de Rod usando sorted
pode ser usado para percorrer as teclas de um dict
na ordem de classificação:
for key in sorted(my_dict.keys()):
print key, my_dict[key]
...
e também por causa do tuple
são ordenados pelo primeiro membro da tupla, você pode fazer o mesmo com items
:
for key, val in sorted(my_dict.items()):
print key, val
...
Para os dados de cadeia
output = []
def uniq(input):
if input not in output:
output.append(input)
print output