递归替换dict键中的字符

2024-09-30 08:24:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在编写一个脚本,该脚本将Android应用程序的元数据作为嵌套字典插入MongoDB。然而,由于一些键包括'.'(由于APK文件中的组件名称),不幸的是,在正在处理的版本中isn't accepted by MongoDB。目前正在尝试编写一个递归脚本,将插入的dict数据中的键的'.'替换为'/',但仍有一些键没有更改以满足要求

def fixKeys(dictionary):
    for k,v in dictionary.items():
        if isinstance(v, dict):
            if '.' in k:
                dictionary[k.replace('.','/')] = dictionary.pop(k)
            fixKeys(v)
        else:
            if '.' in k:
                dictionary[k.replace('.','/')] = dictionary.pop(k)
    return dictionary 

输入示例:

data = {"gender":"male","name.data": {"last.name":"Arabulut","first.name":"Altay","parents.names":{"father.name":"John","mother.name":"Jennifer"}}, "birthday.data":{"birthday.day":"01","birthday.month":"03","birthday.year":"1977"}}

你知道可能遗漏了什么吗


Tags: 数据namein脚本应用程序datadictionaryif
1条回答
网友
1楼 · 发布于 2024-09-30 08:24:35

编辑后,我更正确地理解了您的问题,未知数量嵌套dict的递归解决方案如下:

def fixKeys(dictionary):
    for k,v in list(dictionary.items()):
        if isinstance(v, dict):
            dictionary[k.replace('.', '/')] = fixKeys(v)
        else:
            dictionary[k.replace('.', '/')] = v
        if "." in k:
            dictionary.pop(k)
    return dictionary

m_dict = {"gender":"male", "name.data": {"last.name":"Arabulut","first.name":"Altay","parents.names":{"father.name":"John","mother.name":"Jennifer"}}, "birthday.data":{"birthday.day":"01","birthday.month":"03","birthday.year":"1977"}}

new_dict = fixKeys(m_dict)
print(str(new_dict))

输出:

{'gender': 'male', 'name/data': {'last/name': 'Arabulut', 'first/name': 'Altay', 'parents/names': {'father/name': 'John', 'mother/name': 'Jennifer'}}, 'birthday/data': {'birthday/day': '01', 'birthday/month': '03', 'birthday/year': '1977'}}

很好的问题。喜欢编码和调试

相关问题 更多 >

    热门问题