1
votes

Convertir les clés d'un dictionnaire imbriqué en majuscules

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'}}


0 commentaires

3 Réponses :


2
votes

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]


0 commentaires

1
votes

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


3 commentaires

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): .



1
votes

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)


0 commentaires