La définition de la valeur dans une étude python dictionnaire donné une liste d'indices et de la valeur
Désolé si cette question a été répondu avant, j'ai été à la recherche de solutions mais je suis peut-être pas en utilisant les bons termes de recherche.
De toute façon, ce que j'essaie de faire est de définir par programmation d'une valeur dans un dictionnaire, éventuellement imbriquées, étant donné une liste d'indices et d'une valeur.
Ainsi, par exemple, disons que ma liste d'indices est:
['person', 'address', 'city']
et la valeur est
'New York'
Je veux comme résultat un objet dictionary comme:
{ 'Person': { 'address': { 'city': 'New York' } }
Fondamentalement, la liste représente un "chemin" imbriquée dans un dictionnaire.
Je pense que je peux construire le dictionnaire lui-même, mais là où je suis d'achoppement est de savoir comment définir la valeur. Évidemment, si je viens d'écrire du code pour ce qui est manuel, il serait:
dict['Person']['address']['city'] = 'New York'
Mais comment puis-je l'index dans le dictionnaire et définir la valeur comme programme si j'ai juste une liste des indices et de la valeur?
Espère que cela a un sens et n'est pas trop con une question... 🙂 Merci pour toute aide.
- Quel est le problème avec
dict[x][y][z] = value
? Où obtenez-vousvalue
à partir de? C'est quoi ce bizarre format? - C'est faux parce qu'il peut avoir de longueur variable nombre de clés imbriquées.
- Vous pouvez être en mesure d'éviter de nidification par l'aide de n-uplet clés:
d[tuple(da_list)] = value
- Pour plus de contexte, je dois prendre de nombreuses chaînes de caractères dans le format 'key1:key2:key3=valeur" et la transformer en un imbriquée dictionnaire, où key1 est au premier niveau, key2 à la deuxième, etc. Les chaînes peuvent avoir une touche, deux touches, trois touches. Donc un peu de ficelle de fractionnement me met une liste de clés, et une valeur et où je vais, à partir de là est la question suivante...
- La question est: "pourquoi avez-vous transformer cela en un imbriquée dictionnaire?" Êtes-vous sûr que vous avez vraiment besoin d'un imbriquée dictionnaire? Des choses comme cela peut souvent être codé mieux avec tuple clés, ou d'autres structures de données.
- En fin de compte l'objet construit sera cracher comme JSON...où la hiérarchie est nécessaire. Mais si il ya une meilleure façon d'aller de mes chaînes de caractères à un stringified objet JSON je suis très ouvert à ça 🙂 j'ai peut-être le génie de la solution!?
- Quel est le problème avec juste d["key1:key2:cle3"] = valeur?
- Si le problème est le json conversion, vous pouvez être en mesure d'utiliser un tuple-clés à l'interne et à seulement convertir à une structure imbriquée lorsque vous devez produire le json. @ekhumoro j'imagine que le programme qui reçoit les données s'attend à quelque chose de imbriqués, comme indiqué dans la question, donc, à l'aide d'une chaîne ne serait pas produire une production utilisable de toute façon(même si json valide).
- Oui, mon commentaire était un peu rhétorique: l'OP n'a pas entièrement défini son vrai problème.
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme cela pourrait aider:
Et vous pouvez l'utiliser comme ceci:
for
look que vous ré-attribuer ledic
variable à point à l'intérieur du dictionnaire. Dans l'exemple, lorsquenested_set
est de définir, d'abord, vous avezdic == d
. Puis lefor
boucle effectue l'appeldic = dic.setdefault("person", {})
qui ajoute la paire"person": {}
àd
et également renvoie le référencés{}
. Maintenantdic is d["person"]
, de sorte que la boucle suivante définit la cléaddress
à l'intérieur du dictionnaire, définitiondic
à point à l'intérieur de l'intérieur dictionnaire. Etc. La dernière touche est traitée d'une manière particulière, parce que vous ne voulez pas créer des dictionnaires plus.Tout d'abord, vous devriez regarder setdefault
Comme une fonction que j'avais écris comme
Ce serait utilisée comme:
Cela peut être nettoyé avec gestion des erreurs et ce, également à l'aide de
*args
plutôt que d'une seule touche-liste argument pourrait être agréable; mais l'idée est quevous pouvez effectuer une itération sur les touches, tirant vers le haut le dictionnaire approprié à chaque niveau.
Voici une autre possibilité:
J'ai d'abord obtenu ce à partir d'ici: https://stackoverflow.com/a/10218517/1530754.
Très intelligent et élégant si vous me demandez.
Voici ma solution simple: il suffit d'écrire
Vous pouvez même le faire:
Maintenant les coulisses:
J'ai pris la liberté d'étendre le code de la réponse de Bakuriu. Donc upvotes sur ce sont facultatifs, car son code est en soi une comédie solution, qui je n'aurais pas pensé.
Lors de la configuration de
create_missing
pour Vrai, vous êtes en s'assurant de ne déjà existant valeurs:L'utilisation de ces paire de méthodes
except:
, il devrait jamais apparaissent dans le code. Vous souhaitez utiliserexcept KeyError
à la place. Aussi votre solution casse si quelqu'un utilise un autre type de mappage dedict
. Vous pouvez utiliserabc.MutableMapping
ouabc.Mapping
Voici une variante de Bakuriu réponse qui ne repose pas sur une fonction spécifique: