2 votes

Comment faire en sorte que la clé d'un dictionnaire soit la clé du dictionnaire ?

Est-il possible de prendre la valeur d'une paire clé-valeur d'un dictionnaire et d'en faire la clé de l'ensemble du dictionnaire ?

Au cas où ce que je demande ne serait pas clair,

J'ai une liste de dictionnaires, où les dictionnaires ressemblent à ceci :

[{'HOUSE NAME': '1A', 'White Bread loaf large': 1, 'Brown Bread loaf large': 1,
  'Skimmed Milk Pint': 1, 'Cheddar Cheese Medium 300g': 1}, ...]

et c'est ce que je veux changer :

[1A : {'White Bread loaf large': 1, 'Brown Bread loaf large': 1,
       'Skimmed Milk Pint': 1, 'Cheddar Cheese Medium 300g': 1}, ...]

Je suis novice en matière de python, et je n'ai pas fait de tentative parce que je ne sais vraiment pas par où commencer, et je n'arrive pas à trouver quoi que ce soit en ligne.

2voto

ScienceSnake Points 580

Comme ça :

old_dict = {'HOUSE NAME': '1A', 'White Bread loaf large': 1, 'Brown Bread loaf large': 1, 'Skimmed Milk Pint': 1, 'Cheddar Cheese Medium 300g': 1}
new_dict = {old_dict.pop('HOUSE NAME'): old_dict}

Si vous disposez d'une liste de dictionnaires de ce type, il vous suffit de placer ceci dans une boucle

new_dict = {}
for old_dict in old_list_of_dicts:
    new_dict[old_dict.pop('HOUSE NAME')]: old_dict

EDIT : Explication ajoutée

Pourquoi cela fonctionne-t-il ? dict.pop(key) fait deux choses. Premièrement, elle retourne la valeur du dictionnaire attachée à key. Deuxièmement, elle supprime cette entrée du dictionnaire. Comme ces deux actions sont demandées dans cette question, il est logique d'utiliser cette fonction. C'est aussi plus rapide que de boucler sur chaque entrée lors de la création d'un nouveau dictionnaire comme dans certaines autres réponses [note : je n'ai pas testé cela explicitement]. Il faut cependant noter que cette fonction modifie le dictionnaire existant. Si cela n'est pas souhaitable, vous pouvez soit copier les anciens dictionnaires précédents, soit utiliser l'une des autres réponses proposées

1voto

joao Points 1498

Vous voulez donc transformer une liste de dictionnaires en un dictionnaire de dictionnaires.

Voici une première façon simple de le faire, en itérant sur les dictionnaires dans le fichier la liste d'entrée :

result = {}
for d in input_list:
    result[d[key]] = {k: v for k, v in d.items() if k != key}   

La valeur de la clé "NOM DE MAISON" (d[clé]) est ce que vous voulez comme clé dans le nouveau dictionnaire de dictionnaires.

L'expression entre parenthèses {} dans la dernière ligne s'appelle un liste compréhension vous devez le lire comme suit "donnez-moi un dictionnaire de paires (k, v), où k et v sont obtenus par itération sur les paires (éléments) de d, mais seulement si k vérifie la condition k != clé". . C'est en fait juste une façon élégante d'enlever la clef "NOM DE MAISON" de chacun de ces dictionnaires, mais les compréhensions sont vraiment utiles et valent bien l'investissement que représente leur étude.

En fait, nous pourrions faire tout cela en une seule compréhension :

result = {d[key]: {k: v for k, v in d.items() if k != key} for d in input_list}

0voto

BE-Code Points 81

Au lieu d'utiliser une liste, vous aurez besoin d'un dictionnaire de dictionnaires. (utilisez des accolades au lieu de crochets)

0voto

Alain T. Points 1649

Pour chaque dictionnaire de la liste, créez-en un en extrayant le nom de la maison. Vous pouvez faire cela dans une compréhension de liste :

A = [{'HOUSE NAME': '1A', 'White Bread loaf large': 1, 
     'Brown Bread loaf large': 1, 'Skimmed Milk Pint': 1, 
     'Cheddar Cheese Medium 300g': 1}]

B = { d.pop('HOUSE NAME'):d  for d in map(dict,A) }

print(B)

{'1A': {'White Bread loaf large': 1, 'Brown Bread loaf large': 1, 
         'Skimmed Milk Pint': 1, 'Cheddar Cheese Medium 300g': 1}}

Note1 : le map(dict,A) est là pour éviter de modifier les dictionnaires de A. Vous n'en avez pas besoin si vous avez l'intention de jeter A par la suite ou de réaffecter la nouvelle liste à la variable A.

Note2 : ceci suppose que la valeur de chaque 'NOM DE MAISON' est présente dans un seul dictionnaire de la liste. La fusion de valeurs en double nécessiterait une approche différente.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X