python3 créer un dictionnaire de dictionnaire de maniere récursive

a marqué ce sujet comme résolu.

Bonjour, je vous explique mon probleme, j’ai une liste de string : ["nourriture", "feculent", "pate", "spaghettis"] et je voudrais que cela se transforme en dictionnaire de dictionnaire comme ceci : {"nourriture": {"feculent": {"pate": "spaghettis"}}}

chaque element de la liste sera une clé de dictionnaire qui contiendra un dictionnaire avec le terme suivant, sauf le dernier qui qui restera un string

mon probleme c’est que je n’arrive pas a générer un dictionnaire de dictionnaire de dictionnaire en python3, j’essaye de le faire via une fonction récursive

voici mon code :

def build_conf(data_dict: dict, data: list):
    if len(data) == 1:
        data_dict = data[0]
        return data_dict
    key = data[0]
    data = date[1:-1]
    return build_conf(data_dict[key], data)
    
data = ["nourriture", "feculent", "pate", "spaghettis"]
build_conf({"tomate":"russe", "poivron": {"rouge":"france"}}, data)

je lui envoit un dictionnaire (non vide) et la fonction dois me rajouter a ce dictionnaire : {"nourriture": {"feculent": {"pate": "spaghettis"}}}

par avance merci pour votre aide

Salut,

Récursive ou non, l’idée est de parcourir chaque élément de la liste en gardant à l’idée qu’une valeur devra être associée à cette clé dans le dictionnaire courant. Ce n’est dans ton code pas le cas, avec data_dict[key] qui n’existe tout simplement pas, la méthode setdefault des dictionnaires te serait alors utile.

Le plus simple aurait été d’itérer à l’envers et de construire ton dictionnaire de toute pièce, ce qui aurait évité d’avoir à gérer le cas particulier de la dernière valeur, mais ce n’est pas possible ici puisque tu veux intégrer les données à un dictionnaire existant.

Pour gérer au mieux cette question de cas particulier, je te propose alors dès le départ de séparer data en deux : la liste des clés d’un côté (data[:-1]) et la dernière valeur de l’autre (data[-1]) (ou autrement dit *keys, value = data).

Je ne suis pas sûr de bien comprendre ta phrase.

Pour chaque clé dans le dictionnaire, tu n’es pas sûr qu’un sous-dictionnaire existe. Tu ne peux alors pas accéder à data_dict[key] sans risque de lever une KeyError. setdefault est une méthode des dictionnaires qui va te permettre d’insérer une valeur pour cette clé si celle-ci n’est pas déjà présente.

Après le tout est de parcourir les premières clés pour ajouter le sous-dictionnaire, et associer la dernière à clé à la valeur dans le dictionnaire le plus intérieur.

chaque element de la liste sera une clé de dictionnaire qui contiendra un dictionnaire avec le terme suivant, sauf le dernier qui qui restera un string

Uther

Une telle structure est assez inhabituelle, y a-t-il une raison particulière à utiliser une telle approche alambiquée ? Je peux me tromper (après tout, nous n’avons pas tout le background de ton problème ;) ), mais j’ai l’impression que tu te compliques potentiellement la vie. N’y aurait-il pas une structure plus adaptée et facile à utiliser pour modéliser ton problème ?

+1 -0

j’ai une api propriétaire qui me retourne un dict en guise de paramètre, je veut modifier ce dictionnaire et lui envoyer de nouveaux paramètres.

ma question, c’est que je n’ai pas compris comment on génére ce dictionnaire de dictionnaire de maniere récursive, comment en python on peut obtenir sa ? {dict1:{dict2:{dict3}}}

quelle argument en faite je dois envoyer a ma fonction récursive ?

Comme toute structure de données arborescente, tu commences avec une structure vide et tu la peuples à l’aide ses appels récursifs. Pour ça tu peux au choix appeler la fonction en lui passant le dictionnaire dans lequel stocker le traitement, soit utiliser le retour de la fonction pour l’y intégrer.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte