Cette question porte sur l'utilisation d'un itérateur (et il est assez amusant de constater que Python 2 .iteritems
n'est plus supporté dans Python 3) pour supprimer ou ajouter des éléments, et il doit avoir un Non comme seule bonne réponse comme vous pouvez le trouver dans la réponse acceptée. Pourtant : la plupart des chercheurs essaient de trouver une solution, ils ne se soucient pas de la manière dont cela est fait techniquement, que ce soit un itérateur ou une récursion, et il n'y a pas d'autre moyen de trouver une solution. es une solution au problème :
Vous ne pouvez pas changer en boucle un dict sans utiliser une fonction supplémentaire (récursive).
Cette question doit donc être liée à une question dont la solution est opérationnelle :
Par les mêmes méthodes récursives, vous pourrez également ajouter des éléments comme le demande la question.
Puisque ma demande de lier cette question a été refusée, voici une copie de la solution qui permet de supprimer des éléments d'un dict. Voir Comment supprimer une paire clé/valeur à chaque fois que la clé choisie apparaît dans un dictionnaire profondément imbriqué ? (= "supprimer") pour les exemples / crédits / notes.
import copy
def find_remove(this_dict, target_key, bln_overwrite_dict=False):
if not bln_overwrite_dict:
this_dict = copy.deepcopy(this_dict)
for key in this_dict:
# if the current value is a dict, dive into it
if isinstance(this_dict[key], dict):
if target_key in this_dict[key]:
this_dict[key].pop(target_key)
this_dict[key] = find_remove(this_dict[key], target_key)
return this_dict
dict_nested_new = find_remove(nested_dict, "sub_key2a")
L'astuce
L'astuce consiste à déterminer à l'avance si une clé cible fait partie des prochains enfants (= this_dict[key] = les valeurs de l'itération actuelle du dict) avant d'atteindre le niveau de l'enfant de manière récursive. Ce n'est qu'à ce moment-là que vous pourrez encore supprimer une paire clé/valeur du niveau enfant lors de l'itération d'un dictionnaire. Une fois que vous avez atteint le même niveau que la clé à supprimer et que vous essayez de la supprimer à partir de là, vous obtiendrez l'erreur :
RuntimeError: dictionary changed size during iteration
La solution récursive ne modifie que le sous-niveau des valeurs suivantes et évite donc l'erreur.