Em python, sei como remover itens de uma lista.
item_list = ['item', 5, 'foo', 3.14, True]
item_list.remove('item')
item_list.remove(5)
Este código acima remove os valores 5 e 'item' de item_list. Mas quando há muitas coisas para remover, tenho que escrever muitas linhas de
item_list.remove("something_to_remove")
Se eu souber o índice do que estou removendo, eu uso:
del item_list[x]
onde x é o índice do item que desejo remover.
Se eu souber o índice de todos os números que desejo remover, usarei algum tipo de loop para del
os itens nos índices.
Mas e se eu não souber os índices dos itens que desejo remover?
Eu tentei item_list.remove('item', 'foo')
, mas recebi um erro dizendo que remove
só leva um argumento.
Existe uma maneira de remover vários itens de uma lista em uma única instrução?
PS Eu usei del
e remove
. Alguém pode explicar a diferença entre esses dois, ou eles são iguais?
obrigado
del
exclui um item por seu índice. Aremove
função de uma lista encontra o índice de um item e, em seguida, chamadel
esse índice.Respostas:
Em Python, criar um novo objeto geralmente é melhor do que modificar um existente:
O que é equivalente a:
No caso de uma grande lista de valores filtrados (aqui,
('item', 5)
é um pequeno conjunto de elementos), usar umset
pode levar a uma melhoria de desempenho, pois ain
operação está em O (1):Observe que, conforme explicado nos comentários e sugerido aqui , o seguinte pode economizar ainda mais tempo, evitando que o conjunto seja construído a cada loop:
Um filtro bloom também é uma boa solução se a memória não for barata.
fonte
in
operação. Veja estes benchmarks para comparações das quatro estruturas de dados primitivas. Sim, o conjunto é construído a cada loop, conforme sugerido aqui , consequentemente salvar o conjunto em uma variável dedicada para usar na expressão geradora pode economizar tempo.id(item_list)
antes e depoisitem_list = [e for e in item_list if e not in ('item', 5)]
. Verifique minha resposta para ver como modificar uma lista no local.a lista final após a remoção deve ser a seguinte
Código de Linha Única
a saída seria a seguinte
fonte
Não sei por que todos se esqueceram de mencionar a incrível capacidade do
set
s em python. Você pode simplesmente lançar sua lista em um conjunto e, em seguida, remover tudo o que deseja remover em uma expressão simples como:fonte
Estou postando minha resposta a partir daqui porque vi que também se encaixa aqui. Ele permite remover vários valores ou remover apenas duplicatas desses valores e retorna uma nova lista ou modifica a lista fornecida no local.
Extensão Docstring:
Você deve ser claro sobre o que realmente deseja fazer, modificar uma lista existente ou fazer uma nova lista com os itens específicos ausentes. É importante fazer essa distinção no caso de você ter uma segunda referência apontando para a lista existente. Se você tem, por exemplo ...
Este pode ser ou não o comportamento que você deseja.
fonte
Você pode usar a função filterfalse do módulo itertools
Exemplo
Resultado:
fonte
Não entendo exatamente por que você não gosta de .remove, mas para obter o primeiro índice correspondente a um valor, use .index (valor):
em seguida, remova o valor correspondente:
.index (valor) obtém a primeira ocorrência de valor e .remove (valor) remove a primeira ocorrência de valor
fonte
del item_list[ind]
vez depop
se não precisar do valor do resultado.Você pode usar isto -
Suponha que temos uma lista,
l = [1,2,3,4,5]
Queremos deletar os dois últimos itens em uma única declaração
Temos saída:
Mantenha simples
fonte