367 votes

Comment vider une liste en Python ?

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

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

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

28 votes

Alors pourquoi les dicts et les sets python ont-ils une méthode clear(), mais pas les listes ?

13 votes

Mais s'il y a plusieurs références à l'objet, cela peut être utile.

3 votes

Cela pourrait être utile si j'ai besoin d'effacer une liste partagée sur des processus au moment de l'exécution et que je n'ai pas besoin d'attendre le garbage collection (ou est-ce que je me trompe ? ai-je mal compris le garbage collection ?). De plus, si je veux vérifier chaque élément éclaté, je peux le déboguer alors que je ne peux pas utiliser le slicing (ou est-ce que je me trompe). Je n'ai pas besoin d'arrêter l'exécution du processus pendant que je vide ma liste.

584voto

fortran Points 26495

Cette opération supprime en fait le contenu de la liste et ne remplace pas l'ancienne étiquette par une nouvelle liste vide.

del l[:]

exemple :

l1 = [1, 2, 3]
l2 = l1
del l1[:]
print(l2)

Par souci d'exhaustivité, l'affectation des tranches produit le même effet :

l[:] = []

et peut être utilisé pour réduire une partie de la liste tout en remplaçant une partie en même temps (mais cela sort du cadre de la question).

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

3 votes

Deux autres questions : Qu'est-ce que "del" exactement ? (J'en déduis qu'il délivre des choses mais je ne sais pas vraiment ce que c'est) et 2ème question : Comment lisez-vous (à voix haute) [ :].

2 votes

Pour une bonne explication de del, je me référerais aux docs : docs.python.org/reference/simple_stmts.html#the-del-statement

14 votes

Je n'ai pas l'habitude de lire à haute voix le code python xD, mais si je devais le faire, je pense que je dirais "slice from the begining to the end of the list l".

62voto

Adam Batkin Points 20920

Vous pouvez essayer :

alist[:] = []

Ce qui veut dire : Ajoutez la liste [] (0 élément) à l'endroit [:] (tous les index du début à la fin)

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

6 votes

Pourquoi ne pas simplement alist = [] ?

19 votes

@mitenka qui ne vide pas la liste, il écrase la variable alist avec une liste différente qui se trouve être vide. Si quelqu'un d'autre avait une référence à la liste originale, elle reste telle quelle (c'est-à-dire qu'elle contient ce qui était dedans au départ).

0 votes

@mitenka Une autre raison est que alist.clear() ou alist[:] = [] permet de vérifier que alist c'est vraiment une liste. Disons que vous avez alist retourné par une fonction foo() . Vous avez pensé foo a retourné une liste mais en fait il a retourné un None . Utilisation de alist = [] ne peut pas rattraper cette erreur.

32voto

Dan D. Points 17448

il s'avère qu'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

1 votes

Dans Python 2.7.2, sur ma machine, ils sont à peu près les mêmes. Ils tournent tous deux entre 13,5 et 13,7 usec par boucle.

0 votes

Vous devriez également mesurer python3 -mtimeit "l=list(range(1000))" "b=l[ :]" pour calculer "b[ :] = []" et "del b[ :]". Faites-le et lol...

1 votes

J'ai fait le benchmark avec python 3.5 et je suis d'accord avec leetNightshade . .clear() , del b[:] et b[:]=[] tout fonctionne de la même manière ( b[:]=[] étant légèrement plus lent.

-2voto

Mark Rushakoff Points 97350
list = []

réinitialisera list à une liste vide.

Notez que vous ne devez généralement pas ombrager les noms de fonctions réservés, tels que list qui est le constructeur d'un objet liste -- vous pourriez utiliser lst ou list_ à la place, par exemple.

40 votes

Non : cela ne modifiera pas la liste, cela affecte simplement une liste vide à la variable list . Si vous attendez d'une fonction qu'elle modifie une liste transmise (par exemple), elle ne fera pas ce que vous voulez.

10 votes

Pas vraiment. La question est "Comment vider une liste" et non "Comment assigner sur une variable qui contient une liste".

6 votes

La question n'était pas ambiguë, le snippet de l'op faisait sortir des éléments de la liste (c'est ça, la modifier en place)...

-3voto

user3672451 Points 29

Un autre code simple que vous pourriez utiliser (en fonction de votre situation) est le suivant :

index=len(list)-1

while index>=0:
    del list[index]
    index-=1

Il faut commencer l'index à la longueur de la liste et revenir en arrière plutôt que d'avoir l'index à 0, en avant, car cela donnerait un index égal à la longueur de la liste qui ne serait coupée que de moitié.

Veillez également à ce que la ligne while comporte le signe "supérieur ou égal à". Si vous l'omettez, il vous restera la liste[0].

17 votes

Réinventer la roue avec un cube

1 votes

Haha. C'est la deuxième réponse bizarre (+ un commentaire approprié) que je rencontre sur SO. Il devrait y avoir un site pour ces choses mémorables :D

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X