Parece tão "sujo" esvaziando uma lista desta maneira:
while len(alist) > 0 : alist.pop()
Existe uma maneira clara de fazer isso?
Parece tão "sujo" esvaziando uma lista desta maneira:
while len(alist) > 0 : alist.pop()
Existe uma maneira clara de fazer isso?
Respostas:
Na verdade, isso remove o conteúdo da lista, mas não substitui o rótulo antigo por uma nova lista vazia:
del lst[:]
Aqui está um exemplo:
lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)
Por uma questão de integridade, a atribuição de fatia tem o mesmo efeito:
lst[:] = []
Também pode ser usado para reduzir uma parte da lista enquanto substitui uma parte ao mesmo tempo (mas isso está fora do escopo da pergunta).
Observe que fazer lst = []
não esvazia a lista, apenas cria um novo objeto e o vincula à variável lst
, mas a lista antiga ainda terá os mesmos elementos e o efeito será aparente se houver outras ligações de variáveis.
Se você estiver executando Python 3.3 ou melhor, você pode usar o clear()
método de list
, que é paralela à clear()
de dict
, set
, deque
e outros tipos de contêineres mutável:
alist.clear() # removes all items from alist (equivalent to del alist[:])
De acordo com a página de documentação vinculada, o mesmo também pode ser alcançado com alist *= 0
.
Para resumir, existem quatro maneiras equivalentes de limpar uma lista no local (muito contrário ao Zen do Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
Você poderia tentar:
alist[:] = []
O que significa: Emenda na lista []
(0 elementos) no local [:]
(todos os índices do início ao fim)
O [:] é o operador de fatia. Veja esta pergunta para mais informações.
alist = []
?
alist
por uma lista diferente que por acaso está vazia. Se alguém teve uma referência à lista original, que permanece como está (ou seja, ele contém tudo o que estava nele para começar)
alist.clear()
ou alist[:] = []
ajuda a verificar se alist
realmente é uma lista. Digamos que você alist
retornou de uma função foo()
. Você pensou que foo
retornou uma lista, mas na verdade ela retornou a None
. Usar alist = []
não pode pegar esse erro.
verifica-se que, com o python 2.5.2, del l[:]
é um pouco mais lento que l[:] = []
em 1.1 usec.
$ python -mtimeit "l=list(range(1000))" "b=l[:];del b[:]"
10000 loops, best of 3: 29.8 usec per loop
$ python -mtimeit "l=list(range(1000))" "b=l[:];b[:] = []"
10000 loops, best of 3: 28.7 usec per loop
$ python -V
Python 2.5.2
.clear()
, del b[:]
E b[:]=[]
todas as corridas o mesmo ( b[:]=[]
sendo um pouco mais lento.
lst *= 0
tem o mesmo efeito que
lst[:] = []
É um pouco mais simples e talvez mais fácil de lembrar. Fora isso, não há muito a dizer
A eficiência parece ser a mesma
0
teria o mesmo efeito. É um truque muito arrumado, porém, estou um pouco triste, que não recebeu muita atenção ..
list = []
redefinirá list
para uma lista vazia.
Observe que você geralmente não deve ocultar nomes de funções reservadas, como list
, que é o construtor de um objeto de lista - você pode usar lst
ou list_
substituir, por exemplo.
list
. Se você esperava que uma função modificasse uma lista passada (por exemplo), isso não faria o que você deseja.
Outro código simples que você pode usar (dependendo da sua situação) é:
index=len(list)-1
while index>=0:
del list[index]
index-=1
Você precisa iniciar o índice no comprimento da lista e retroceder em relação ao índice em 0, para a frente, porque isso resultaria em um índice igual ao comprimento da lista, com apenas o corte pela metade.
Além disso, verifique se a linha while possui um sinal "maior que ou igual a". Se omitir, você deixará a lista [0] restante.