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

有一本字典:


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

我哪里错了?

正确的字典理解是什么样的{{i.upper(): j} if isinstance(j, dict) else {k.upper(): v} for k, v in data.items() for i, j in v.items()}?


FFIVE
浏览 124回答 2
2回答

湖上湖

您可以这样做,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 dict2d2 = keys_to_upper(data)

牧羊人nacy

您的代码的问题是,d1如果值是字典,您正在重新分配。您可以使用以下方法解决此问题copy.deepcopy():代码:from copy import deepcopyd = {}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}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python