Il semble tellement "sale" de vider une liste de cette façon:
while len(alist) > 0 : alist.pop()
Existe-t-il un moyen clair de le faire?
Il semble tellement "sale" de vider une liste de cette façon:
while len(alist) > 0 : alist.pop()
Existe-t-il un moyen clair de le faire?
Réponses:
Cela supprime en fait 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 sort du 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 si elle avait d'autres liaisons de variable.
Si vous utilisez Python 3.3 ou mieux, vous pouvez utiliser la clear()
méthode list
, qui est parallèle à clear()
des dict
, set
, deque
et d' autres types de conteneurs mutable:
alist.clear() # removes all items from alist (equivalent to del alist[:])
Selon la page de documentation liée, la même chose peut également être obtenue avec alist *= 0
.
Pour résumer, il existe quatre façons équivalentes d'effacer une liste sur place (tout à fait contrairement au Zen de Python !):
alist.clear() # Python 3.3+
del alist[:]
alist[:] = []
alist *= 0
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.
alist = []
?
alist
avec une liste différente qui se trouve être vide. Si quelqu'un d'autre avait une référence à la liste d'origine, cela reste tel quel (c'est-à-dire qu'il contient tout ce qui s'y trouvait pour commencer)
alist.clear()
ou alist[:] = []
aide à vérifier qu'il alist
s'agit vraiment d'une liste. Supposons que vous soyez alist
revenu d'une fonction foo()
. Vous pensiez avoir foo
renvoyé une liste, mais en effet, elle a renvoyé un None
. L'utilisation alist = []
ne peut pas attraper cette erreur.
il s'avère qu'avec python 2.5.2, del l[:]
est légèrement plus lent que l[:] = []
par 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[:]
et b[:]=[]
tout tourne de la même manière ( b[:]=[]
étant légèrement plus lent.
lst *= 0
a le même effet que
lst[:] = []
C'est un peu plus simple et peut-être plus facile à retenir. A part ça, il n'y a pas grand chose à dire
L'efficacité semble être à peu près la même
0
aurait le même effet. C'est un truc assez sympa cependant, je suis un peu triste, qu'il n'ait pas reçu beaucoup d'attention ..
list = []
sera réinitialisé list
dans une liste vide.
Notez que vous ne devez généralement pas masquer les noms de fonctions réservés, tels que list
, qui est le constructeur d'un objet liste - vous pouvez utiliser lst
ou à la list_
place, par exemple.
list
. Si vous vous attendiez à ce qu'une fonction modifie une liste passée (par exemple), cela ne ferait pas ce que vous voulez.
Un autre code simple que vous pourriez utiliser (selon votre situation) est:
index=len(list)-1
while index>=0:
del list[index]
index-=1
Vous devez commencer l'index à la longueur de la liste et revenir en arrière par rapport à l'index à 0, en avant car cela vous aboutirait à un index égal à la longueur de la liste, celui-ci n'étant que réduit de moitié.
Assurez-vous également que la ligne while a un signe «supérieur ou égal à». L'omission vous laissera la liste [0] restante.