Método para remover duplicados em list

1,635 views
Skip to first unread message

Gabriel Mendonça

unread,
Nov 18, 2016, 11:08:05 AM11/18/16
to Python Brasil
Galera, primeiramente boa tarde, meu nome é Gabriel, sou desenvolvedor PHP. Mas já estudo python faz alguns anos. Mas nunca tive o intuito de usá-lo profissionalmente até conhecer o django e entender que eu perco muito tempo escrevendo muita coisa desnecessária em PHP! Enfim. Gostaria de saber se tem algum método no python que faça a remoção de itens duplicados de uma lista. No momento estou utilizando uma que fiz, mas se tiver nativo melhor!

Agradeço desde já.

Abs!

Fabio C. Barrionuevo da Luz

unread,
Nov 18, 2016, 11:09:27 AM11/18/16
to python...@googlegroups.com


Use o set( ) para remover os duplicados.
Exemplo:

x = [ 1, 2, 1, 1, 3, 2, ]
print(x)

s = set(x)
print(s)


-- 

Fábio C. Barrionuevo da Luz
Palmas - Tocantins - Brasil - América do Sul

http://pythonclub.com.br/

Blog colaborativo sobre Python e tecnologias Relacionadas, mantido totalmente no https://github.com/pythonclub/pythonclub.github.io .

Todos são livres para publicar. É só fazer fork, escrever sua postagem e mandar o pull-request. Leia mais sobre como publicar em README.md e contributing.md.

Regra básica de postagem:

"Você" acha interessante? É útil para "você"? Pode ser utilizado com Python ou é útil para quem usa Python? Está esperando o que? Publica logo, que estou louco para ler...

   


--
--
------------------------------------
Grupo Python-Brasil
http://www.python.org.br/wiki/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasil+unsubscribe@googlegroups.com

---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasil+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Vinicius Assef

unread,
Nov 18, 2016, 11:13:17 AM11/18/16
to python...@googlegroups.com
Oi Gabriel.

Você pode converter sua lista em um set. Automaticamente os itens
duplicados são retirados.

Veja a documentação:
https://docs.python.org/3/library/stdtypes.html#set-types-set-frozenset
> --
> --
> ------------------------------------
> Grupo Python-Brasil
> http://www.python.org.br/wiki/AntesDePerguntar
>
> <*> Para visitar o site do grupo na web, acesse:
> http://groups.google.com/group/python-brasil
>
> <*> Para sair deste grupo, envie um e-mail para:
> python-brasi...@googlegroups.com
>
> ---
> Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos
> Grupos do Google.
> Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie
> um e-mail para python-brasi...@googlegroups.com.

Willie

unread,
Nov 18, 2016, 11:18:31 AM11/18/16
to Python Brasil
Só complementando a resposta do pessoal. Tem um link bem interessante aqui:
http://stackoverflow.com/questions/7961363/removing-duplicates-in-lists/7961390
em especial esta resposta que foi dada:
http://stackoverflow.com/a/7961425

Linux - Junior Polegato

unread,
Nov 18, 2016, 3:22:49 PM11/18/16
to python...@googlegroups.com
Olá!

Em Python tem o "set", assim dada uma lista "duplicados", para
obter outra lista "unicos", seria:

duplicados = [1, 2, 10, 1, 8, 4, 7, 6, 5, 3, 9, 10]
unicos = list(set(duplicados))

Contudo "set" não mantém a mesma ordem de "duplicados", visto
que ele gera um hash para cada valor e então basicamente ordena e exclui
os hashs iguais. Caso queira manter a ordem, acho interessante usar o
"filter", onde filtrará somente os elementos que não estão antes da
posição deste elemento, podendo-se usar "e not in duplicados[:n]" ou
"duplicados[:n].count(e) == 0", exemplos:

unicos = list(zip(*filter(lambda (n, e): e not in duplicados[:n],
enumerate(duplicados)))[1])
unicos = list(zip(*filter(lambda (n, e): duplicados[:n].count(e) == 0,
enumerate(duplicados)))[1])
unicos = map(lambda x: x[1], filter(lambda (n, e): e not in
duplicados[:n], enumerate(duplicados)))
unicos = map(lambda x: x[1], filter(lambda (n, e):
duplicados[:n].count(e) == 0, enumerate(duplicados)))

Observe que na versão 3.x precisa-se trocar "(n, e)" por "x",
"e" por "x[1]" e "n" por "x[0]", além de "list(...)" envolvendo "map" e
"zip", pois estes resultam em "generator" próprio em vez de "list" como
na versão 2.7.


--

[]'s

Junior Polegato

Gabriel Mendonça

unread,
Nov 18, 2016, 5:46:42 PM11/18/16
to Python Brasil
Opa, muito obrigado!


---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.

Danilo J. S. Bellini

unread,
Nov 18, 2016, 11:27:45 PM11/18/16
to python-brasil
Em 18 de novembro de 2016 13:27, Gabriel Mendonça <gabrielm...@gmail.com> escreveu:
Galera, primeiramente boa tarde, meu nome é Gabriel, sou desenvolvedor PHP. Mas já estudo python faz alguns anos. Mas nunca tive o intuito de usá-lo profissionalmente até conhecer o django e entender que eu perco muito tempo escrevendo muita coisa desnecessária em PHP! Enfim. Gostaria de saber se tem algum método no python que faça a remoção de itens duplicados de uma lista. No momento estou utilizando uma que fiz, mas se tiver nativo melhor!

Sem manter a ordem, como todo mundo já disse, tem o list(set(data))... Para manter a ordem, acho que o mais simples é usar as chaves de um OrderedDict com qualquer coisa como valor, já que não há um OrderedSet.

Admitindo:

>>> from collections import OrderedDict
>>> from itertools import tee, repeat, zip_longest
>>> data = [1, 4, 1, 3, 1, 5, 3, 3, 5, 1, 2, 1, 5, 4, 3, 2, 1]

Possíveis soluções:

>>> list(OrderedDict(zip(*tee(data))))
[1, 4, 3, 5, 2]
>>> list(OrderedDict(zip_longest(data, [])))
[1, 4, 3, 5, 2]
>>> list(OrderedDict(zip(data, repeat(None))))
[1, 4, 3, 5, 2]
>>> list(OrderedDict((k, None) for k in data))
[1, 4, 3, 5, 2]

(Lembrando que no Python 2 deve-se usar izip_longest ao invés de zip_longest)

Ou então usar algo como esse recipe do Raymond Hettinger:

http://code.activestate.com/recipes/576694-orderedset/

--
Danilo J. S. Bellini
---------------
"It is not our business to set up prohibitions, but to arrive at conventions." (R. Carnap)
Reply all
Reply to author
Forward
0 new messages