3
votes

Python - créer un dictionnaire avec plusieurs clés et où la valeur est également le dictionnaire

J'ai un dictionnaire:

{'11.67': {'value': '12'}, '12.67': {'value': '12'}}

Ma sortie souhaitée est la suivante:

test={"11.67":1,"12.67":2}
indexes=test.keys()
final_dict={}
temp_dict={}
for index in indexes:
    b=index.split('.')[0]
    temp_dict['value']=b;
    final_dict.update({index:temp_dict})
print (final_dict)

La valeur dans le second dictionnaire est le premier index lorsque faire le fractionnement sur la clé.

J'ai écrit ceci:

{'11.67': {'value': '11'}, '12.67': {'value': '12}}

Mais le résultat est faux:

test={"11.67":1,"12.67":2}

Je ne sais pas ce qui ne va pas. Merci

Et encore un UPDATE: Je dois utiliser des index qui sont dict_keys. Je dois partir de cette partie du code.


0 commentaires

5 Réponses :


5
votes

vous pouvez simplement faire ceci:

test = {"11.67": 1, "12.67": 2}
res = {key: {"value": str(int(float(key)))} for key in test}
# {'11.67': {'value': '11'}, '12.67': {'value': '12'}}

où je convertis d'abord les chaînes en float s, puis jette la partie fractionnaire en utilisant int code> et reconvertissez à nouveau en str .

ce qui ne va pas dans votre code est bien expliqué dans Réponse de Carsten .


2 commentaires

désolé j'ai oublié de mentionner que je dois utiliser des index, car je commence le code à partir de cette partie Et encore un UPDATE: je dois utiliser des index qui est dict_keys. Je dois partir de cette partie du code.


alors ce serait juste pour la clé dans les index . (au lieu de pour la clé dans le test ).



4
votes

Votre erreur consiste à déclarer le temp_dict en dehors de la boucle. Cela fonctionne:

test={"11.67":1,"12.67":2}
indexes=test.keys()
final_dict={}
for index in indexes:
    temp_dict={}
    b=index.split('.')[0]
    temp_dict['value']=b;
    final_dict.update({index:temp_dict})
print (final_dict)


0 commentaires

3
votes

Le problème est que vous faites toujours référence au même objet temp_dict , donc toute modification de celui-ci sera reflétée dans l'ensemble de son instance.

Je suggère d'utiliser une compréhension de dict pour aborder votre problème, qui réduira la création du dictionnaire à une seule ligne:

final_dict = {idx: {'value': idx.split('.')[0]} for idx in test.keys()}


0 commentaires

3
votes

try,

>>> {i:{'value': "%d"%eval(i)} for i in {"11.67":1,"12.67":2}}
{'11.67': {'value': '11'}, '12.67': {'value': '12'}}
>>> 

{} -> compréhension du dictionnaire et mise en forme de l'ancienne chaîne "% s"

p>


0 commentaires

2
votes

Après avoir importé temp_dict dans le fichier final_dict, effacez le temp_dict. GOOD_LUCK

test={"11.67":1, "12.67":2, "15.66":3}
indexes = test.keys()
final_dict = {}
temp_dict = {}
for index in indexes:
    b = index.split('.')[0]
    temp_dict['value'] = b
    final_dict[index] = temp_dict
    temp_dict = {}
print(final_dict)


0 commentaires