11
votes

Stocker le chemin du dictionnaire à Python

Tout neuf à Python, disons que j'ai un dict: xxx pré>

si Child3 change de couleur de cheveux régulièrement, je voudrais peut-être écrire une application pour accélérer la maintenance des données. Dans cet exemple, j'utiliserais: p>

kidshair['allkids']['child3']['hair'] = 'blue'


6 commentaires

Vérifiez votre mise en forme. Kidshair générera une erreur de syntaxe telle qu'elle est maintenant.


Ceci est associé: Stackoverflow.com/Questtions/3797957/... (Bien que ce ne soit pas exactement ce que vous demandez)


@AtheistForpaytheist: Cela ne fonctionnera toujours pas. «Child1», «Child2» et «Child3» devraient tous être dans un dictionnaire.


@Joelcorntt. Oh Lawd, vous pouvez dire que je suis nouveau à cela! Je pense que je l'ai maintenant.


@AtheistForpaytheist: Oui. Tu l'as eu. :)


Vous pouvez également envisager cette réponse Stackoverflow.com/a/3798595/255008 avec code pour créer un "dictionnaire de points".


5 Réponses :


11
votes

Selon ce dont vous avez besoin, l'option la plus simple peut être d'utiliser des tuples comme des touches de dictionnaire au lieu de dictionnaires imbriqués:

def dictsetter(item, name):
     def f(value):
         item[name] = value
     return f

mypath = dictsetter(test["a"]["b"], "c")

mypath(2)


1 commentaires

Brillamment décrit, m'a permis de résoudre plus que de résoudre mon problème. Sincères remerciements.



1
votes

Le plus proche que vous puissiez faire avec votre structure de données actuelle consiste à obtenir le dernier dict et à l'utiliser directement:

name[key] = value


0 commentaires

1
votes

Vous pouvez enregistrer une référence à kidshair ['allkids'] ['enfant3'] facilement: xxx

Vous ne pouvez pas enregistrer tout le chemin, car L'affectation change la touche dans le kidshair ['Allkids'] ['Child3'] Dictionnaire.
Si vous voulez changer un dictionnaire, vous devez y avoir une référence, non pas à quelque chose qu'il contient.


0 commentaires

9
votes

Vous pouvez créer un ensemble de fonctions qui accède à un "chemin" pour un dictionnaire donné: xxx

utilisation: xxx


2 commentaires

En rétrospectivement, il est probablement plus facile de passer des tuples au «chemin» au lieu de rejoindre et de fractionnement des chaînes.


J'ai fini par créer de code similaire avant de trouver cette question. Cependant, comme vous l'avez suggéré, j'ai créé des fonctions acceptées des tuples, ainsi que deux fonctions d'assistance acceptées des chaînes et appelées les fonctions de chemin avec appel à Split () comme argument de tuple.



1
votes

Essayez d'utiliser dpath lib https://pypi.org/project/dpath/ << Pré> xxx


0 commentaires