web-dev-qa-db-fra.com

Comment vider une liste en Python?

Il semble si "sale" vider une liste de cette façon:

while len(alist) > 0 : alist.pop()

Existe-t-il un moyen clair de le faire?

343
DrFalk3n

Cela supprime le contenu de la liste, mais ne remplace pas l'ancienne étiquette par une nouvelle liste vide:

del lst[:]

Voici un exemple:

lst1 = [1, 2, 3]
lst2 = lst1
del lst1[:]
print(lst2)

Par souci d’exhaustivité, l’affectation de tranche a le même effet:

lst[:] = []

Il peut également être utilisé pour réduire une partie de la liste tout en remplaçant une partie en même temps (mais cela n’entre pas dans le cadre de la question).

Notez que faire lst = [] ne vide pas la liste, crée simplement un nouvel objet et le lie à la variable lst, mais l'ancienne liste aura toujours les mêmes éléments et l'effet sera apparent s'il avait autres liaisons variables.

553
fortran

Si vous utilisez Python3.3 ou supérieur, vous pouvez utiliser la méthode clear() de list, parallèle à clear() de dict, set, deque et d'autres types de conteneurs mutables:

alist.clear()  # removes all items from alist (equivalent to del alist[:])

Selon la page de documentation liée, il est également possible d’obtenir la même chose avec alist *= 0.

Pour résumer, il existe quatre manières équivalentes de nettoyer une liste sur place (ce qui est tout à fait contraire au Zen of Python !):

  1. alist.clear() # Python 3.3+
  2. del alist[:]
  3. alist[:] = []
  4. alist *= 0
141
Eugene Yarmash

Tu pourrais essayer:

alist[:] = []

Ce qui signifie: Splice dans la liste [] (0 éléments) à l'emplacement [:] (tous les index du début à la fin)

Le [:] est l'opérateur de tranche. Voir cette question pour plus d'informations.

59
Adam Batkin

il s'avère que, avec python 2.5.2, del l[:] est légèrement plus lent que l[:] = [] de 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
32
Dan D.
lst *= 0

a le même effet que

lst[:] = []

C'est un peu plus simple et peut-être plus facile à retenir. Autre que cela il n'y a pas grand chose à dire

L'efficacité semble être à peu près la même

3
Ivan Hoffmann
list = []

réinitialisera list dans une liste vide.

Notez que vous ne devez généralement pas masquer les noms de fonctions réservées, tels que list, qui est le constructeur d'un objet de liste. Vous pouvez par exemple utiliser lst ou list_.

0
Mark Rushakoff