python - 用子字典中的一个替换父键值?
问题描述
我有一个dict
如下:
{'data': 'v1', 'data2': {'xyz': 'ABC' }}
我想要一个dict
赞:
{'data': 'v1', 'data2': 'ABC'}
基本上我想使用'data2'
要分配给的键的值'data2'
。
这是一个深度嵌套的多层递归字典。
解决方案
我正在通过翻译一些 JSON 字段来解决类似的问题。
在入口处,我有一个嵌套文档,其中包含一个带有不同语言翻译的嵌套对象:
json_data = {
"title": {
"uk": "title 1 uk",
"ru": "title 2 uk",
"en": "title 3 uk"
},
"items": [
{
"subcategory": {
"uk": "subcategory 1 uk",
"ru": "subcategory 1 ru",
"en": "subcategory 1 en"
},
"items": [
{
"id": 1,
"title": {
"en": "title en 1",
"ru": "title ru 1",
"uk": "title uk 2"
}
},
{
"id": 2,
"title": {
"en": "title en 1.2",
"ru": "title ru 1.2",
"uk": "title uk 1.2"
}
}
]
},
{
"subcategory": {
"uk": "subcategory 1.2 uk",
"ru": "subcategory 1.2 ru",
"en": "subcategory 1.2 en"
},
"items": [
{
"id": 2,
"title": {
"en": "title en 2.2",
"ru": "title ru 2.2",
"uk": "title uk 2.2"
}
}
]
}
]
}
有一个递归生成器,接受一个文档作为输入,以及我要查找的键的名称,其值将作为父键的值返回。
def i18n_generator(json_input={}, language="en"):
if isinstance(json_input, dict):
for k, v in json_input.items():
if isinstance(v, dict) and language in v:
"""
if value is a dict and contains the required field,
set to the parent key value from nested object
"""
json_input[k] = v.get(language, None)
yield
else:
yield from i18n_generator(v, language)
elif isinstance(json_input, list):
# if the document contains a list of dictionaries
for item in json_input:
yield from i18n_generator(item, language)
# run generator
for _ in i18n_generator(json_data, language="uk"):
pass
print(json_data)
输出:
{'title': 'title 1 uk', 'items': [{'subcategory': 'subcategory 1 uk', 'items': [{'id': 1, 'title': 'title uk 2'}, {'id': 2, 'title': 'title uk 1.2'}]}, {'subcategory': 'subcategory 1.2 uk', 'items': [{'id': 2, 'title': 'title uk 2.2'}]}]
推荐阅读
- salesforce - 通过 Docusign rest API 在信封中添加文档时遇到错误
- python - 用于实现二项式期权定价模型的树形数据结构
- bash - bash echo 命令在函数循环中被忽略
- pandas - 如何从熊猫中的对象列中提取和替换整数和浮点值
- docker - docker中的PHPUnit:PowerShell中没有颜色
- c# - 用偏移量看旋转
- temporal-workflow - 如何获取命名空间内所有工作流的搜索属性
- lua - 如何修复lua的lgi中的时区/ dst?
- python - 在 python 中使用 imaplib 模块将邮件下载为 pdf
- c++ - c++ struct的聚合/指定初始化:直接引用另一个字段