为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

FFIVE 2022-07-05 17:45:49
有一本字典: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()] = vprint(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()}?
查看完整描述

2 回答

?
湖上湖

TA贡献2003条经验 获得超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 dict2


d2 = keys_to_upper(data)


查看完整回答
反对 回复 2022-07-05
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

您的代码的问题是,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}}


查看完整回答
反对 回复 2022-07-05
  • 2 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信