Comment faire pour supprimer des éléments à partir d'un dictionnaire lors de l'itération sur elle?

Est-il légitime de supprimer des éléments à partir d'un dictionnaire en Python lors de l'itération sur elle?

Par exemple:

for k, v in mydict.iteritems():
   if k == val:
     del mydict[k]

L'idée est de supprimer les éléments qui ne répondent pas à une certaine condition dans le dictionnaire, au lieu de créer un nouveau dictionnaire qui est un sous-ensemble de l'être itéré.

Est-ce une bonne solution? Il y a plus élégant/efficaces?

  • Une question connexe, avec des réponses très intéressantes: stackoverflow.com/questions/9023078/....
  • On pouvait en avoir essayé facilement. Si elle échoue, elle n'est pas légitime.
  • On pouvait en avoir essayé facilement... et facilement rien appris de valeur. Si elle réussit, elle n'est pas nécessairement légitime. Les cas limites et inattendu réserves abondent. Cette question est non-trivial d'intérêt pour tous les Pythoneux. À la main en agitant le licenciement de l'ordre de "que l'On pouvait avoir essayé facilement!" est inutile et contraire à l'esprit inquisiteur de stackoverflow enquête.
  • Après avoir pris connaissance de maxdu question connexe, je suis d'accord. Vous avez probablement juste de vouloir lire attentivement cette troublante en profondeur de la question et ses réponses écrites à la place. Votre Pythonic esprit sera soufflé.
  • Test d'une idée par vous-même avant de le présenter ici est un peu dans l'esprit de stackoverflow si je ne me trompe pas. C'était tout ce que je voulais transmettre. Désolé si il n'y a eu aucune perturbation à cause de cela. Aussi je pense que c'est une bonne question et ne pas downvote il. J'aime la réponse de Jochen Ritzel la plupart. Je ne pense pas que l'on doit faire tous ces trucs pour supprimer à la volée lors de la suppression, dans une seconde étape est beaucoup plus simple. Que devrait être la préférée de mon point de vue.
  • Muette observation: toute Votre boucle est une sorte de vaine si vous êtes à la recherche d'une clé spécifique. Vous pouvez le remplacer avec try: del mydict[val] except KeyError: pass ou comme un one-liner, avec mydict.pop(val, None), qui seront tous deux O(1) activités, de ne pas O(n). La question est toujours valable même si la condition de la suppression est plus que juste "égale à une certaine valeur" si.

InformationsquelleAutor | 2011-03-21