【发布时间】:2012-07-26 21:26:43
【问题描述】:
我正在尝试创建一个通用函数来替换嵌套字典键中的点。我有一个非泛型函数,深度为 3 级,但必须有一种方法可以做到这一点。任何帮助表示赞赏!到目前为止我的代码:
output = {'key1': {'key2': 'value2', 'key3': {'key4 with a .': 'value4', 'key5 with a .': 'value5'}}}
def print_dict(d):
new = {}
for key,value in d.items():
new[key.replace(".", "-")] = {}
if isinstance(value, dict):
for key2, value2 in value.items():
new[key][key2] = {}
if isinstance(value2, dict):
for key3, value3 in value2.items():
new[key][key2][key3.replace(".", "-")] = value3
else:
new[key][key2.replace(".", "-")] = value2
else:
new[key] = value
return new
print print_dict(output)
更新:为了回答我自己的问题,我使用 json object_hooks 做了一个解决方案:
import json
def remove_dots(obj):
for key in obj.keys():
new_key = key.replace(".","-")
if new_key != key:
obj[new_key] = obj[key]
del obj[key]
return obj
output = {'key1': {'key2': 'value2', 'key3': {'key4 with a .': 'value4', 'key5 with a .': 'value5'}}}
new_json = json.loads(json.dumps(output), object_hook=remove_dots)
print new_json
【问题讨论】:
-
回答你自己的问题,你回答你自己的问题,而不是编辑它。
-
使用我的解决方案,因为我的解决方案快十倍。
-
这样做的好方法。 object_hook 确实简化了整个事情,特别是在我使用名为“include”的“键”的情况下,它需要递归加载额外的 JSON 文件以形成单个多维字典。
-
由于某种莫名其妙的原因,这个使用上述 remove_dots() 的 object_hook 方法只替换了 一些 键名。我有一些保留点。这可能与 obj.keys() 函数中的一些奇怪的排序问题有关吗?我需要制作一个有序的字典吗?我以为 Python3 没有 dict 排序问题?
标签: python dictionary replace nested character