No Python remove()
, a primeira ocorrência de valor será removida de uma lista.
Como remover todas as ocorrências de um valor de uma lista?
Isto é o que eu tenho em mente:
>>> remove_values_from_list([1, 2, 3, 4, 2, 2, 3], 2)
[1, 3, 4, 3]
Abordagem funcional:
Python 3.x
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter((2).__ne__, x))
[1, 3, 3, 4]
ou
>>> x = [1,2,3,2,2,2,3,4]
>>> list(filter(lambda a: a != 2, x))
[1, 3, 3, 4]
Python 2.x
>>> x = [1,2,3,2,2,2,3,4]
>>> filter(lambda a: a != 2, x)
[1, 3, 3, 4]
[y for y in x if y != 2]
__ne__
. Comparar dois valores é um processo muito mais complexo do que apenas chamar__eq__
ou__ne__
em um deles. Pode funcionar corretamente aqui porque você está apenas comparando números, mas no caso geral isso é incorreto e é um bug.Você pode usar uma compreensão de lista:
fonte
in
operador quanto oremove
método digitalizam a lista inteira (até encontrarem uma correspondência), para que você acabe digitalizando a lista várias vezes dessa maneira.Você pode usar a atribuição de fatia se a lista original precisar ser modificada, enquanto ainda estiver usando uma compreensão eficiente da lista (ou expressão do gerador).
fonte
x = [ v for v in x if x != 2 ]
propostas, que criam uma nova lista e alteram x para se referir a ela, deixando a lista original intocada.Repetindo a solução do primeiro post de uma maneira mais abstrata:
fonte
x = [1] * 10000 + [2] * 1000
. O corpo do loop é executado 1000 vezes e .remove () precisa pular 10000 elementos toda vez que é chamado. Isso cheira a O (n * n) para mim, mas não é prova. Penso que a prova seria assumir que o número de 2s na lista é proporcional ao seu comprimento. Esse fator de proporcionalidade desaparece na notação O-grande. O melhor caso, porém, de apenas um número constante de 2s na lista, não é O (n ^ 2), apenas O (2n) que é O (n).Veja a solução simples
Isso retornará uma lista com todos os elementos
x
sem2
fonte
Todas as respostas acima (exceto as de Martin Andersson) criam uma nova lista sem os itens desejados, em vez de removê-los da lista original.
Isso pode ser importante se você tiver outras referências à lista por aí.
Para modificar a lista, use um método como este
Quanto à velocidade, os resultados no meu laptop são (todos em uma lista de 5000 entradas com 1000 entradas removidas)
Portanto, o loop .remove é cerca de 100x mais lento ........ Hmmm, talvez seja necessária uma abordagem diferente. O mais rápido que encontrei foi usar a compreensão da lista, mas depois substituir o conteúdo da lista original.
fonte
def remove_all(x, l): return [y for y in l if y != x]
entãol = remove_all(3,l)
você consegue fazer isso
fonte
À custa da legibilidade, acho que esta versão é um pouco mais rápida, pois não força o tempo a reexaminar a lista, fazendo exatamente o mesmo trabalho que a remoção precisa fazer:
fonte
Abordagem numpy e tempos em relação a uma lista / matriz com 1.000.000 elementos:
Horários:
Conclusão: numpy é 27 vezes mais rápido (no meu notebook) em comparação com a abordagem de compreensão de lista
PS, se você deseja converter sua lista regular de Python
lst
em um array numpy:Configuração:
Verifica:
fonte
fonte
Para remover todas as ocorrências duplicadas e deixar uma na lista:
Aqui está a função que eu usei para o Project Euler:
fonte
Acredito que provavelmente seja mais rápido do que qualquer outra maneira, se você não se importa com a ordem das listas, se você se importa com a ordem final, armazene os índices do original e recorra a ele.
fonte
Muito mais simples, acredito.
fonte
Deixei
A solução mais simples e eficiente, como já publicada anteriormente, é
Outra possibilidade que deveria usar menos memória mas ser mais lenta é
Resultados de tempo para listas de comprimento 1000 e 100000 com 10% de entradas correspondentes: 0,16 vs 0,25 ms e 23 vs 123 ms.
fonte
Remova todas as ocorrências de um valor de uma lista Python
Resultado:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
Alternativamente,
Resultado:
6.9 8.9 3 5 4.9 1 2.9 9 12.9 10.9 11
fonte
Se você não possui um built-in
filter
ou não deseja usar espaço extra e precisa de uma solução linear ...fonte
['Olá Mundo']
fonte
Eu apenas fiz isso para uma lista. Eu sou apenas um iniciante. Um programador um pouco mais avançado certamente pode escrever uma função como esta.
fonte
Também podemos remover todos os locais usando
del
oupop
:Agora, para a eficiência:
Como vemos, a versão in-loco
remove_values_from_list()
não requer memória extra, mas leva muito mais tempo para ser executada:fonte
Ninguém postou uma resposta ótima para a complexidade de tempo e espaço, então pensei em dar uma chance. Aqui está uma solução que remove todas as ocorrências de um valor específico sem criar uma nova matriz e com uma complexidade de tempo eficiente. A desvantagem é que os elementos não mantêm a ordem .
Complexidade temporal: O (n)
Complexidade adicional de espaço: O (1)
fonte
Sobre a velocidade!
fonte
Somente com Python 3
fonte
O que há de errado com:
Usando anaconda
fonte