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, dequee 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 *= 0Você 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 = []?
alistpor 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 alistrealmente é uma lista. Digamos que você alistretornou de uma função foo(). Você pensou que fooretornou 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
0teria o mesmo efeito. É um truque muito arrumado, porém, estou um pouco triste, que não recebeu muita atenção ..
list = []
redefinirá listpara 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 lstou 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.