Je souhaite pouvoir grouper des éléments d'un dictionnaire sous une même clés mais plusieurs niveau d'imbrication plus bas, j'ai déjà un truc pour les premières clés mais j'aimerais pouvoir descendre en indiquant un chemin en string "clé1/clé2/clé3..." qui me permettrait d'appliquer la fonction sur des clées sans créer une nouvelle branche en entier. Sauf que là pour l'instant je sèche un peu ...
Voilà le petit code que j'ai fais pour 1 seul niveau:
def group(Dict,keygroup,keys):
Dict[keygroup] = {}
for x in keys:
Dict[keygroup][x] = Dict[x]
for x in keys:
del Dict[x]
dictionnaire = {"ananas":105,"pomme":0.368}
print dictionnaire
group(dictionnaire,"fruits",["ananas","pomme"])
print dictionnaire
Voilà après 1h30 d'expérimentation, un peu de hasard et beaucoup de chance j'ai trouvé un truc qui marche même si j'ai pas vraiment compris ce que j'ai fais ^^:
def group(Dict,keygroup,keys):
keygroup = keygroup.split("/")
position = Dict
for x,key in enumerate(keygroup):
if key not in position.keys():
position[key] = {}
position = position[key]
else:
position = position[key]
for keypath in keys:
keypath = keypath.split("/")
position = Dict
for x,key in enumerate(keypath):
position = position[key]
position_a_copier = position
last_key = key
position = Dict
for x,key in enumerate(keygroup):
if key in position.keys():
position[key][keypath[-1]] = position_a_copier
position = position[key]
position = Dict
for keypath in keys:
keypath = keypath.split("/")
position = Dict
for key in keypath:
if key in position.keys():
position = position[key]
if key == keypath[-2]:
del position[keypath[-1]]
break
dictionnaire = {"ananas":{"cout":0.5,"nombre":150}}
print dictionnaire
group(dictionnaire,"ananas/parametres",["ananas/cout","ananas/nombre"])
print dictionnaire
Hum, ton code est effectivement un peu confus.
Je pense que quelque chose qui pourrait déjà le simplifier serait d'utiliser la méthode pop des dictionnaires plutôt que del.
Une solution simple serait d'ajouter deux fonctions pop_at et set_at qui prendrait le dictionnaire et une adresse correspondant à la clé pour réaliser les opérations de suppression et d'insertion, puis de les appeler depuis ta fonction group.
Après question optimisation il serait possible d'ajouter par la suite une itération en parallèle sur les clés ayant un même prétexte, pour éviter des répétitions inutiles d'opérations.
Haeu... je suis pas trop familier avec ce que tu as écrit dans la 1ère et la 4ème fonction mais j'ai compris je crois (tu supprime l'adresse en même temps que tu la trouve ?...) .
Aussi ca fais quoi la méthode setdefault ? (de toute façon j'ai pas compris ton 2ème code ^^)
Par contre je suis en python 2.7 du coup je crois pas qu'on puisse faire toute tes synthaxes (je me trompe peut être)
(Par la suite j'aimerai pouvoir aussi les dégrouper mais je me débrouillerais un peu tout seul et je reviendrai si j'ai un pb )
Oui, c'est le principe de la méthode pop : elle supprime la clé tout en renvoyant la valeur associée. C'est très pratique dans ton cas, quand tu veux déplacer une valeur d'une clé vers une autre.
Le 2ème code est plus tordu, c'était pour exploiter cette idée d'optimisation avec un arbre de clés plutôt que des chemins indépendants (je t'invite à regarder le contenu du dictionnaire keytree).
setdefault, c'est une méthode des dictionnaires pour récupérer la valeur associée à une clé, tout en définissant une valeur par défaut si la clé n'est pas présente.
Dans ce code, ça permet de s'assurer que l'on trouvera toujours un dictionnaire dans les valeurs de tree.
Il s'agit en effet de syntaxe Python 3, je t'invite à y passer si tu en as la possibilité. On peut réaliser la même chose sans cette syntaxe, avec du slicing, mais c'est moins élégant.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique
entwanne — @entwanne — Un zeste de Python — La POO en Python — Notions de Python avancées — Les secrets d'un code pythonique