python - 递归替换dict键中的字符
问题描述
我目前正在编写一个脚本,它将 Android 应用程序的元数据作为嵌套字典并将其插入到 MongoDB。但是,由于某些键包含'.'
s(由于 APK 文件中的组件名称),不幸的是,MongoDB在正在处理的版本中不接受它。目前正在尝试编写一个递归脚本,将 s 替换为'.'
s'/'
插入的 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"}}
关于可能缺少什么的任何想法?
解决方案
编辑后我更正确地理解了你的问题,未知数量的嵌套字典的递归解决方案如下:
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'}}
很好的问题。喜欢编码和调试!
推荐阅读
- java - 如何使用hibernate在spring boot中的fillAll方法中添加where条件
- c# - 使用 OCR 的 pdf 中的黑屏编号
- python - 如何从保存的模型中获得文本预测准确性"
- nix - Nix 函数定义头部的问号是什么意思?
- java - Docker:Jenkins-jdk11 无法连接到 Nexus,因为没有找到 JAXB-API
- ios - 自定义 UIView 连接到 MainViewcontoller
- java - spring.resources.chain.strategy.content.enabled 仅适用于 .css 文件
- c++11 - 在 protobuf 类中没有访问或设置值的有效方法
- json - 如何在 Flutter 中将对象编码为 json
- c - STREAMS 在 Linux 中的魔力。什么时候结束?