将嵌套字典的键转换为大写

Convert keys of a nested dictionary to upper case

有字典:

data = {'Common': {'height': 165, 'weight': 70, 'measure': ['cm', 'kg']},
         'Man': 'handsome',
         'Woman': {'feature': 'pretty', 'weight': 50},
         'Dog': {'feature': 'barks', 'height': 10, 'weight': 20}}

只想将字典键转换为大写。

尝试了以下代码:

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()] = d1
    else:
        d[k.upper()] = v

print(d)

...生成带有不必要的键以及高度和重量合理化的输出,如下所示:

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

我的预期输出是:

{'COMMON': {'HEIGHT': 165, 'WEIGHT': 70, 'MEASURE': ['cm', 'kg']},
 'MAN': 'handsome',
 'WOMAN': {'FEATURE': 'pretty', 'WEIGHT': 50},
 'DOG': {'FEATURE': 'barks', 'HEIGHT': 10, 'WEIGHT': 20}}
  1. 我哪里错了?
  2. 正确的字典理解是什么 {{i.upper(): j} if isinstance(j, dict) else {k.upper(): v} for k, v in data.items() for i, j in v.items()}

你可以做类似的事情,复制到其他 dict 使用所需的密钥:

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]

更新: 如果您不仅要更改级别 1 上的键,您应该使用递归函数:

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)

您的代码的问题在于,如果值是字典,您将重新分配 d1。您可以使用 copy.deepcopy():

来解决这个问题

代码:

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

输出:

>>> d
{'COMMON': {'HEIGHT': 165, 'WEIGHT': 70, 'MEASURE': ['cm', 'kg']},
 'MAN': 'handsome',
 'WOMAN': {'FEATURE': 'pretty', 'WEIGHT': 50},
 'DOG': {'FEATURE': 'barks', 'HEIGHT': 10, 'WEIGHT': 20}}

或者,作为字典理解:

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

列表理解 更快,因为它针对 Python interpreter 进行了优化,可以在 looping 期间发现可预测的模式。除了 list comprehensions 的句法优势外,它们通常与 map 的等效使用一样快或更快。

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)

输出>

data = {'COMMON': {'height': 165, 'weight': 70, 'measure': ['cm', 'kg']},
        'Man': 'handsome',
        'WOMAN': {'feature': 'pretty', 'weight': 50},
        'DOG': {'feature': 'barks', 'height': 10, 'weight': 20}}