Esta foi a minha fonte que eu comecei.
Minha lista
L = [0, 23, 234, 89, None, 0, 35, 9]
Quando eu executo isso:
L = filter(None, L)
Eu recebo esses resultados
[23, 234, 89, 35, 9]
Mas não é disso que preciso, o que realmente preciso é:
[0, 23, 234, 89, 0, 35, 9]
Porque eu estou calculando o percentil dos dados e o 0 faz muita diferença.
Como remover o valor Nenhum de uma lista sem remover o valor 0?
filter
versão menos elegante :filter(lambda x: x is not None, L)
- Você pode se livrar dolambda
usopartial
eoperator.is_not
eu acho, mas provavelmente não vale a pena, pois a lista-comp é muito mais limpa.is_not
existia! Eu pensei que era apenasis_
, eu vou acrescentar que, em apenas por diversãois_not
existe e onot_in
que não existe. Na verdade, acho que issonot_in
deve ser transformado em um método mágico__not_contains__
... veja uma pergunta que fiz há um tempo e um comentário que fiz a um respondente ... e ainda não sinto que isso foi resolvido.filterfalse
ou algo dependendo do caso de usox > y
não implicanot x <= y
em python, porque você pode fazer qualquer coisa em__lt__
e__le__
, então por quex not in y
implicamnot x in y
(especialmente desde quenot in
tem seu próprio bytecode?)FWIW, Python 3 facilita esse problema:
No Python 2, você usaria uma compreensão de lista:
fonte
__ne__
tipo em oposição apartial
ene
?operator
módulo.__ne__
?x != y
chama internamentex.__ne__(y)
onde ne significa "diferente de". Portanto,None.__ne__
é um método vinculado que retorna True quando chamado com qualquer valor diferente de Nenhum . Por exemplo,bm = None.__ne__
chamado withbm(10)
retorna NotImplemented, que como valor verdadeiro, ebm(None)
retorna False .Usando a compreensão da lista, isso pode ser feito da seguinte maneira:
O valor de l é:
fonte
Para Python 2.7 (consulte a resposta de Raymond, para equivalente em Python 3):
Querendo saber se algo "não é Nenhum" é tão comum no python (e em outras linguagens OO), que no meu Common.py (que importo para cada módulo com "do Common import *"), incluo estas linhas:
Para remover os elementos Nenhum de uma lista, basta:
Acho isso mais fácil de ler do que a compreensão da lista correspondente (que Raymond mostra, como sua versão do Python 2).
fonte
partial(is_not, None)
que essa solução. Eu acredito que isso será mais lento (embora isso não seja muito importante). Mas com um par de importações de módulos python, há necessidade de um personalizado definido função neste casoA resposta do @jamylak é bastante agradável, no entanto, se você não deseja importar alguns módulos apenas para executar esta tarefa simples, escreva seu próprio
lambda
local:fonte
[x for x in L if x is not None]
o outro código era apenas uma adição i explicitamente declarado não recomendarIteração x Espaço , o uso pode ser um problema. Em diferentes situações, a criação de perfil pode mostrar ser "mais rápida" e / ou "menos memória" intensiva.
A primeira abordagem (como também sugerida por @jamylak , @Raymond Hettinger e @Dipto ) cria uma lista duplicada na memória, o que pode custar caro para uma lista grande com poucos
None
entradas.A segunda abordagem percorre a lista uma vez e novamente a cada vez até que a
None
seja atingida. Isso pode consumir menos memória e a lista fica menor à medida que avança. A diminuição no tamanho da lista pode acelerar aNone
entrada de muitas entradas na frente, mas o pior caso seria se muitasNone
entradas estivessem na parte de trás.Paralelização e técnicas no local são outras abordagens, mas cada uma tem suas próprias complicações em Python. Conhecer os casos de uso de dados e tempo de execução, bem como criar um perfil do programa, é o ponto de partida para operações intensivas ou grandes dados.
A escolha de qualquer abordagem provavelmente não será importante em situações comuns. Torna-se mais uma preferência de notação. De fato, nessas circunstâncias incomuns,
numpy
oucython
podem ser alternativas que valem a pena, em vez de tentar microgerenciar otimizações de Python.fonte
L.count(None)
e ligando.remove(None)
várias vezes, o que tornaO(N^2)
a situação que você está tentando resolver não deve ser tratada dessa maneira, os dados devem ser reestruturados em um banco de dados ou arquivo em vez disso, se tiver muita memória.O(n^2)
é somente quando a lista inteira éNone
.numpy
seria capaz de lidar com este tipo de operação de uma forma mais optimizadanumpy
nos últimos anos, mas é uma habilidade separada. SeL
for instanciado como um emnumpy.array
vez de um Pythonlist
,L = L[L != numpy.array(None)]
(stackoverflow.com/a/25255015/3003133) provavelmente será melhor que qualquer um dos dois, mas eu não conheço os detalhes de implementação para processamento vs memória abaixo. Pelo menos, cria uma matriz de booleanos de comprimento duplicado para a máscara. A sintaxe de uma comparação dentro de um operador de acesso (índice), dessa forma, é nova para mim. Essa discussão também chamou minha atençãodtype=object
.fonte
Se é tudo uma lista de listas, você pode modificar a resposta de sir @ Raymond
L = [ [None], [123], [None], [151] ] no_none_val = list(filter(None.__ne__, [x[0] for x in L] ) )
para python 2 no entantono_none_val = [x[0] for x in L if x[0] is not None] """ Both returns [123, 151]"""
<< list_indice [0] para a variável na Lista se a variável não for Nenhuma >>
fonte
Digamos que a lista seja como abaixo
Isso retornará apenas os itens cujos
bool(item) is True
Isso é equivalente a
Para filtrar apenas Nenhum:
Equivalente a:
Para obter todos os itens avaliados como False
fonte