1) Estilo quase inglês:
Teste a presença usando o in
operador e aplique o remove
método
if thing in some_list: some_list.remove(thing)
O remove
método removerá apenas a primeira ocorrência de thing
, para remover todas as ocorrências que você pode usar em while
vez de if
.
while thing in some_list: some_list.remove(thing)
- Simples o suficiente, provavelmente a minha escolha. Para listas pequenas (não resiste a frases simples)
Essa atitude de atirar primeiro-fazer-perguntas-última é comum em Python. Em vez de testar antecipadamente se o objeto é adequado, basta executar a operação e capturar exceções relevantes:
try:
some_list.remove(thing)
except ValueError:
pass # or scream: thing not in some_list!
except AttributeError:
call_security("some_list not quacking like a list!")
É claro que a segunda cláusula exceto no exemplo acima não é apenas de humor questionável, mas é totalmente desnecessária (o objetivo era ilustrar a digitação de patos para pessoas não familiarizadas com o conceito).
Se você espera várias ocorrências:
while True:
try:
some_list.remove(thing)
except ValueError:
break
- um pouco detalhado para este caso de uso específico, mas muito idiomático em Python.
- isso tem um desempenho melhor que o nº 1
- PEP 463 propôs uma sintaxe mais curta para try / exceto o uso simples que seria útil aqui, mas não foi aprovado.
No entanto, com o contextmanager suppress () contextpress (introduzido no python 3.4), o código acima pode ser simplificado para isso:
with suppress(ValueError, AttributeError):
some_list.remove(thing)
Novamente, se você espera várias ocorrências de algo:
with suppress(ValueError):
while True:
some_list.remove(thing)
3) estilo funcional:
Por volta de 1993, Python tem lambda
, reduce()
, filter()
e map()
, graças a um Lisp hacker que lhes falta e patches de trabalho apresentados *. Você pode usar filter
para remover elementos da lista:
is_not_thing = lambda x: x is not thing
cleaned_list = filter(is_not_thing, some_list)
Existe um atalho que pode ser útil para o seu caso: se você deseja filtrar itens vazios (na verdade, itens onde bool(item) == False
, como None
zero, cadeias vazias ou outras coleções vazias), pode passar None como o primeiro argumento:
cleaned_list = filter(None, some_list)
- [update] : no Python 2.x,
filter(function, iterable)
costumava ser equivalente a [item for item in iterable if function(item)]
(ou [item for item in iterable if item]
se o primeiro argumento for None
); no Python 3.x, agora é equivalente a (item for item in iterable if function(item))
. A diferença sutil é que o filtro é usado para retornar uma lista, agora funciona como uma expressão geradora - tudo bem se você estiver apenas repetindo a lista limpa e descartando-a, mas se realmente precisar de uma lista, precisará encerrar a filter()
chamada com o list()
construtor.
- * Essas construções com sabor Lispy são consideradas um pouco alienígenas em Python. Por volta de 2005, Guido chegou a falar em desistir
filter
- junto com companheiros map
e reduce
(eles ainda não foram embora, mas reduce
foram transferidos para o módulo functools , que vale a pena dar uma olhada se você gosta de funções de alta ordem ).
4) estilo matemático:
A compreensão de lista tornou-se o estilo preferido para manipulação de lista em Python desde que foi introduzido na versão 2.0 pelo PEP 202 . A lógica por trás disso é que compreensões lista fornecer uma maneira mais concisa para criar listas em situações em que map()
e filter()
teria atualmente ser usado e / loops ou aninhadas.
cleaned_list = [ x for x in some_list if x is not thing ]
As expressões de gerador foram introduzidas na versão 2.4 pelo PEP 289 . Uma expressão de gerador é melhor para situações em que você realmente não precisa (ou deseja) de ter uma lista completa criada na memória - como quando você deseja iterar os elementos, um de cada vez. Se você estiver apenas repetindo a lista, considere uma expressão geradora como uma compreensão preguiçosa da lista avaliada :
for item in (x for x in some_list if x is not thing):
do_your_thing_with(item)
Notas
- convém usar o operador de desigualdade em
!=
vez de is not
( a diferença é importante )
- para críticos de métodos que implicam uma cópia da lista: ao contrário da crença popular, as expressões geradoras nem sempre são mais eficientes do que as compreensões da lista - faça um perfil antes de reclamar