Avoir un dictionnaire:
{'COMMON': {'HEIGHT': 165, 'WEIGHT': 70, 'MEASURE': ['cm', 'kg']}, 'MAN': 'handsome', 'WOMAN': {'FEATURE': 'pretty', 'WEIGHT': 50}, 'DOG': {'FEATURE': 'barks', 'HEIGHT': 10, 'WEIGHT': 20}}
Je voudrais convertir uniquement les clés du dictionnaire en MAJUSCULES.
J'ai essayé le code suivant:
{'COMMON': {'HEIGHT': 10, 'WEIGHT': 20, 'MEASURE': ['cm', 'kg'], 'FEATURE': 'barks'}, 'MAN': 'handsome', 'WOMAN': {'HEIGHT': 10, 'WEIGHT': 20, 'MEASURE': ['cm', 'kg'], 'FEATURE': 'barks'}, 'DOG': {'HEIGHT': 10, 'WEIGHT': 20, 'MEASURE': ['cm', 'kg'], 'FEATURE': 'barks'}}
3 Réponses :
Vous pouvez faire quelque chose comme ça, copier dans un autre dict
avec les clés requises:
data = {'Common': {'height': 165, 'weight': 70, 'measure': ['cm', 'kg']}, 'Man': 'handsome', 'Woman': {'feature': 'pretty', 'weight': 50}, 'Dog': {'feature': 'barks', 'height': 10, 'weight': 20}} def keys_to_upper(dict1): dict2 = {} for k in dict1.keys(): if isinstance(dict1[k], dict): dict2[k.upper()] = keys_to_upper(dict1[k]) else: dict2[k.upper()] = dict1[k] return dict2 d2 = keys_to_upper(data)
UPDATE: Si vous souhaitez modifier non seulement les clés du niveau 1, vous devez utiliser la fonction récursive:
data = {'Common': {'height': 165, 'weight': 70, 'measure': ['cm', 'kg']}, 'Man': 'handsome', 'Woman': {'feature': 'pretty', 'weight': 50}, 'Dog': {'feature': 'barks', 'height': 10, 'weight': 20}} data2 = {} for k in data.keys(): data2[k.upper()] = data[k]
Le problème avec votre code est que vous réaffectez d1
si la valeur est un dictionnaire. Vous pouvez résoudre ce problème en utilisant copy.deepcopy () code>
:
Code:
>>> {k.upper(): {i.upper(): j for i, j in v.items()} if isinstance(v, dict) else v for k, v in data.items()} {'COMMON': {'HEIGHT': 165, 'WEIGHT': 70, 'MEASURE': ['cm', 'kg']}, 'MAN': 'handsome', 'WOMAN': {'FEATURE': 'pretty', 'WEIGHT': 50}, 'DOG': {'FEATURE': 'barks', 'HEIGHT': 10, 'WEIGHT': 20}}
Sortie:
>>> d {'COMMON': {'HEIGHT': 165, 'WEIGHT': 70, 'MEASURE': ['cm', 'kg']}, 'MAN': 'handsome', 'WOMAN': {'FEATURE': 'pretty', 'WEIGHT': 50}, 'DOG': {'FEATURE': 'barks', 'HEIGHT': 10, 'WEIGHT': 20}}
Alternativement, comme compréhension de dictionnaire:
from copy import deepcopy d = {} d1 = {} for k, v in data.items(): if isinstance(v, dict): for i, j in v.items(): d1[i.upper()] = j d[k.upper()] = deepcopy(d1) else: d[k.upper()] = v
Pourquoi deepcopy n'est-il pas nécessaire pour la compréhension du dictionnaire?
@reservoirinvest car au lieu de créer un dictionnaire appelé d1
en utilisant une boucle for, puis de l'associer à la clé d'origine, nous le construisons en utilisant une compréhension de dictionnaire imbriquée, donc nous ne l'affectons jamais à un variable.
@reservoirinvest vous pouvez supprimer deepcopy
de l'original si vous avez utilisé d [k.upper ()] = {i.upper (): j pour i, j dans v.items ()}
après if isinstance (v, dict):
.
La compréhension de liste est plus rapide car elle est optimisée pour l ' interpréteur
Python afin de repérer un modèle prévisible pendant la boucle
. Outre l'avantage syntaxique des compréhensions de listes
, elles sont souvent aussi rapides ou plus rapides qu'une utilisation équivalente de map
.
data = {'COMMON': {'height': 165, 'weight': 70, 'measure': ['cm', 'kg']}, 'Man': 'handsome', 'WOMAN': {'feature': 'pretty', 'weight': 50}, 'DOG': {'feature': 'barks', 'height': 10, 'weight': 20}}
résultat >
data = {'Common': {'height': 165, 'weight': 70, 'measure': ['cm', 'kg']}, 'Man': 'handsome', 'Woman': {'feature': 'pretty', 'weight': 50}, 'Dog': {'feature': 'barks', 'height': 10, 'weight': 20}} for k, v in data.items(): if isinstance(v, dict): data[k.upper()] = data.pop(k)