Remover valores iguais de uma lista.

2,046 views
Skip to first unread message

Bruno Becker

unread,
Sep 6, 2015, 6:41:36 PM9/6/15
to Python Brasil
Boa noite!

Preciso remover valores repetidos de uma lista,mas remover inclusive o que sobrar desta repetição,por exemplo:

lista=[1,1,2,2,3,3,3,4,4,5,6,7,8,9,9,9,9]

tem que ficar assim depois:

lista =[5,6,7,8]

ou seja,tem que remover os IGUAIS.

Sei que o "set" elimina apenas os repetidos,teria um modo prático de fazer isso?

Alexandre Souza

unread,
Sep 6, 2015, 6:46:25 PM9/6/15
to python...@googlegroups.com
Bruno,

In [164]: import collections

In [165]: lista=[1,1,2,2,3,3,3,4,4,5,6,7,8,9,9,9,9]

In [166]: [x for x in lista if collections.Counter(lista)[x] == 1]
Out[166]: [5, 6, 7, 8]

[ ]'s

--
--
------------------------------------
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.
Para mais opções, acesse https://groups.google.com/d/optout.



--
-- 
Twitter: @_AleSou || GitHub: alexandre || Reddit: ubbersith
--
[...]o sentido disso tudo é que não há sentido em tentar enlouquecer
para impedir-se de ficar louco...guarde sua sanidade para mais
tarde[...] - Douglas Adams

Linux - Junior Polegato

unread,
Sep 8, 2015, 9:43:44 AM9/8/15
to python...@googlegroups.com
Olá!

»» lista=[1,1,2,2,3,3,3,4,4,5,6,7,8,9,9,9,9]

»» [x for x in lista if lista.count(x) == 1]
[5, 6, 7, 8]

»» filter(lambda x: lista.count(x) == 1, lista)
[5, 6, 7, 8]


--

[]'s

Junior Polegato

Linux - Junior Polegato

unread,
Sep 8, 2015, 9:52:56 AM9/8/15
to python...@googlegroups.com
On 08-09-2015 10:43, Linux - Junior Polegato wrote:
> On 06-09-2015 19:41, Bruno Becker wrote:
>> Boa noite!
>> Preciso remover valores repetidos de uma lista,mas remover inclusive
>> o que sobrar desta repetição,por exemplo:
>> lista=[1,1,2,2,3,3,3,4,4,5,6,7,8,9,9,9,9]
>> tem que ficar assim depois:
>> lista =[5,6,7,8]
>> ou seja,tem que remover os IGUAIS.
>> Sei que o "set" elimina apenas os repetidos,teria um modo prático de
>> fazer isso?
>
> »» lista=[1,1,2,2,3,3,3,4,4,5,6,7,8,9,9,9,9]
> »» [x for x in lista if lista.count(x) == 1]
> [5, 6, 7, 8]
> »» filter(lambda x: lista.count(x) == 1, lista)
> [5, 6, 7, 8]

Uma outra alternativa que pode ser mais rápida seria, pois assim vai
testar apenas uma vez cada número diferente:

»» lista = [1,1,2,2,3,3,3,4,4,5,6,7,8,9,9,9,9]
»» lista_unicos = set(lista)
»» lista_unicos
set([1, 2, 3, 4, 5, 6, 7, 8, 9])
»» [x for x in lista_unicos if lista.count(x) == 1]
[5, 6, 7, 8]
»» filter(lambda x: lista.count(x) == 1, lista_unicos)

guilherme....@gmail.com

unread,
Nov 26, 2015, 8:03:59 AM11/26/15
to Python Brasil, bbecke...@gmail.com
Alguém tem a resposta completa

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Nov 26, 2015, 9:06:06 AM11/26/15
to python...@googlegroups.com
Cara, a lista estah ordenada? Se estah ordenada, deveria ser super facil criar um algoritmo que remove, certo?
Basta manter na memoria o numero anterior e sempre que o numero for igual ao anterior, remover o numero e o anterior, se jah nao tiver sido removido.
Isso eh O(n), nao imagino um jeito de fazer que tenha complexidade menor...
[]s
--
--
------------------------------------
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.
Para mais opções, acesse https://groups.google.com/d/optout.



<< ideas don't deserve respect >>

Lario dos Santos Diniz

unread,
Nov 26, 2015, 10:08:53 AM11/26/15
to python...@googlegroups.com

def limp_list(l):
  listac = l[:]
  for x in l:
      a = l.count(x)
      if a > 1:
          listac.remove(x)
  
  return listac
--

Lário dos Santos Diniz






Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Nov 26, 2015, 10:37:11 AM11/26/15
to python...@googlegroups.com
Esse algo abaixo nao seria legal.

Olha soh: 

Delete | del l[i] | O(N) |
Remove | l.remove(...)| O(N) |

Cada chamada ao remove(x) na verdade tem complexidade O(N), fora a complexidade de espaco, que nao eh citada. O count nao eh diferente, entao a complexidade do metodo abaixo eh O(n^2)
O mais facil seria fazer o contrario, devolver uma lista nova adicionando o elemento somente quando nao for duplicado. Ou melhor - um generator que itera na lista original e chama yield somente nos elementos nao duplicados.
Outra opcao eh usar uma lista ligada em python, onde o remove seria O(1). Ainda assim, teria de ser ordenada e comparar o numero anterior e nao usar count(x).

Cloves Oliveira

unread,
Nov 26, 2015, 11:15:17 AM11/26/15
to Python Brasil
Vc pode usar o filter

lista = [1, 1, 2, 2, 3, 3, 3, 4, 4, 5, 6, 7, 8, 9, 9, 9, 9]
res = filter(lambda valor: True if lista.count(valor) == 1 else False, lista)

res ==> [5, 6, 7, 8]

Explicando:
Apenas usei o filter para buscar os valores que eu queria de acordo com sua condicional. No final, apenas os que satisfazem a condição são retornados pra nova lista.

Peço desculpas por está já te dando a resposta mas estou meio apressado pra ir dando "dicas".

Mais info:
https://pythonhelp.wordpress.com/2012/05/13/map-reduce-filter-e-lambda/

Lario dos Santos Diniz

unread,
Nov 26, 2015, 12:22:13 PM11/26/15
to python...@googlegroups.com
Você diz algo como:

def limp_list(l):
  listac = []
  for x in l:
      a = l.count(x)
      print a
      if a == 1:
          listac.append(x)
  
  return listac

Marcelo Valle (BLOOMBERG/ LONDON)

unread,
Nov 26, 2015, 12:47:05 PM11/26/15
to python...@googlegroups.com
Isso jah seria melhor, mas l.count(x) eh O(n).
Entao o algo abaixo ainda eh O(n^2)

Seria legal torna-lo O(n), ou seja, a parte do count pode ser otimizada

George Silva

unread,
Nov 26, 2015, 12:51:58 PM11/26/15
to Python Brasil
Muito mais fácil :D

a = [1, 2, 2, 3, 5, 6, 7, 7, 7, 7, 7 , 9 , 9, 10]
b = set(a)
print b
c = list(b)
print c

George R. C. Silva
Sigma Geosistemas LTDA
----------------------------

George Silva

unread,
Nov 26, 2015, 12:53:47 PM11/26/15
to Python Brasil
Duh, agora que vi, que tem que sobrar só quem é único.

felipe pagliuco

unread,
Apr 22, 2020, 10:06:11 AM4/22/20
to Python Brasil
Olá,

Sei que já deve ter resolvido seu problema a anos rs, mas em uma pesquisa achei esse post vou compartilhar 2 códigos que podem retornar se os valores se repetem em uma lista, espero ajudar outros membros que necessitem:


#Exemplo 1, retorna uma lista com os itens repetidos:
a
= [1,2,3,2,1,5,6,5,5,5]
print([item for item, count in Counter(a).items() if count > 1])



#Exemplo 2, retorna um dicionário com o item e a quantidade :
cnt
= Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue','blue']:
 cnt
[word] += 1
print(cnt)








Em domingo, 6 de setembro de 2015 19:41:36 UTC-3, Bruno Becker escreveu:

Marcos Silva

unread,
Apr 22, 2020, 11:24:21 AM4/22/20
to python...@googlegroups.com
def rem_rep(lt):
    l = []
    for i in lt:
        if i not in l:
            l.append(i)
    l.sort()
    return l

lt = [1, 1, 2, 1, 3, 4, 3, 6, 7, 6, 7, 8, 10 ,50,50,50]

lt = rem_rep(lt)
print (lt)

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/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.
Reply all
Reply to author
Forward
0 new messages