Quelle est la meilleure façon de supprimer un élément d'un dictionnaire par valeur, c'est-à-dire lorsque la clé de l'élément est inconnue? Voici une approche simple:
for key, item in some_dict.items():
if item is item_to_remove:
del some_dict[key]
Y a-t-il de meilleures façons? Y a-t-il un problème avec la mutation (suppression d'éléments) du dictionnaire lors de son itération?
python
dictionary
Boutons840
la source
la source
Réponses:
Sachez que vous testez actuellement l'identité d'objet (
is
ne renvoie queTrue
si les deux opérandes sont représentés par le même objet en mémoire - ce n'est pas toujours le cas avec deux objets qui se comparent à==
). Si vous le faites exprès, vous pouvez réécrire votre code commeMais cela peut ne pas faire ce que vous voulez:
Donc, vous voulez probablement
!=
au lieu deis not
.la source
some_dict.iteritems()
ici et mettrefor
etif
déclarations sur des lignes séparées pour plus de lisibilitéiteritems
maintenantitems
. En Python 2.7,iteritems()
c'est en effet mieux.dict()
avec une expression de générateur appropriée, qui est 2.4. meta: peut parcourir les peps ici pour trouver des trucs.La
dict.pop(key[, default])
méthode vous permet de supprimer des éléments lorsque vous connaissez la clé. Il renvoie la valeur à la clé s'il supprime l'élément, sinon il renvoie ce qui est passé commedefault
. Voir les documents . 'Exemple:
la source
la source
Une simple comparaison entre del et pop () :
résultat:
Ainsi, del est plus rapide que pop () .
la source
pop()
(comme @ n-1-1 ci-dessus) - ce qui n'est pas une option pour l'del
opérateur.timeit
. Merci pour cet exemple clair.items()
renvoie une liste, et c'est cette liste que vous itérez, donc la mutation du dict dans la boucle n'a pas d'importance ici. Si vous utilisiez à laiteritems()
place, la mutation du dict dans la boucle serait problématique , et de même pourviewitems()
Python 2.7.Je ne peux pas penser à une meilleure façon de supprimer des éléments d'un dict par valeur.
la source
Je construisais une liste de clés à supprimer, puis je les supprimais. C'est simple, efficace et évite tout problème lié à l'itération et à la mutation simultanées du dict.
la source
c est le nouveau dictionnaire, et a est votre dictionnaire d'origine, {'z', 'w'} sont les clés que vous voulez supprimer d'un
Vérifiez également: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html
la source
la source
Il n'y a rien de mal à supprimer des éléments du dictionnaire lors de l'itération, comme vous l'avez proposé. Soyez prudent lorsque plusieurs threads utilisent le même dictionnaire en même temps, ce qui peut entraîner une KeyError ou d'autres problèmes.
Bien sûr, consultez la documentation sur http://docs.python.org/library/stdtypes.html#typesmapping
la source
for k,v in d.iteritems(): del d[k]
donneraitRuntimeError: dictionary changed size during iteration
. Voir l'explication de mithrandi.Voilà comment je le ferais.
la source