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)