在python中如何通过用点分隔的键拆分/转换字典
我有一个字典(或JSON对象),如下所示:在python中如何通过用点分隔的键拆分/转换字典,python,algorithm,dictionary,Python,Algorithm,Dictionary,我有一个字典(或JSON对象),如下所示: {"Key1.Key2.Key3(someparameter)": {"balh.Key1": 4711}} 我想将其转换为一个dict,在python中如下所示: {"Key1": {"key2": {"Key3(someparameter)": {"balh":
{"Key1.Key2.Key3(someparameter)": {"balh.Key1": 4711}}
我想将其转换为一个dict,在python中如下所示:
{"Key1":
{"key2":
{"Key3(someparameter)": {"balh":
{"Key1": 4711}
}
}
}
}
我当前的代码是这样的,但并不总是有效:
def cleankeys(source) -> dict:
out = {}
if source:
for key, value in source.items():
newkey = key
params = ""
if "(" in key:
newkey = key.split("(",1)[0]
params = "("+key.split("(",1)[1]
if isinstance(value, dict):
if "." in newkey:
rord = newkey.split(".")
rord[-1] = rord[-1] + params
rord.reverse()
tmp = cleankeys(value)
for k in rord:
tmp = {k: tmp}
out[newkey] = tmp
else:
out[newkey] = cleankeys(value)
elif isinstance(value, list):
if "." in newkey:
rord = newkey.split(".")
rord[-1] = rord[-1] + params
rord.reverse()
tmp = value
for k in rord:
tmp = {k: tmp}
out[k] = tmp[k]
else:
out[newkey] = value
else:
print(newkey)
out[newkey] = value
return out
你能帮我怎么做吗?你有没有更有效的方法来翻译这段话?如果我理解正确,你需要的就是:
def convert(data, delimiter="."):
def split_keys(key, delimiter="."):
result = []
start = -1
key_list = key.split(delimiter)
for i, item in enumerate(key_list):
if "(" in item and ")" in item:
result.append(item)
if "(" in item:
start = i
elif ")" in item:
result.append(".".join(key_list[start:i + 1]))
start = -1
elif not item or start != -1:
continue
else:
result.append(item)
return result
result = {}
if not isinstance(data, dict):
return data
for key, value in data.items():
if delimiter in key:
key_list = split_keys(key, delimiter)
temp = result
for i, k in enumerate(key_list):
if i != len(key_list) - 1:
temp[k] = {}
temp = temp[k]
continue
if isinstance(value, list):
temp[k] = [convert(item) for item in value]
else:
temp[k] = convert(value)
continue
if isinstance(value, list):
result[key] = [convert(item) for item in value]
continue
result[key] = convert(value)
return result
assert convert({"Key1.Key2.Key3(someparameter)": {"balh.Key1": 4711}}) == {'Key1': {'Key2': {'Key3(someparameter)': {
'balh': {'Key1': 4711}}}}}, convert({"Key1.Key2.Key3(someparameter)": {"balh.Key1": 4711}})
assert convert({"Key1": {"blah": 4711}}) == {"Key1": {"blah": 4711}}, convert({"Key1": {"blah": 4711}})
assert convert({"Key1.Key2.Key3(..x)": [{"blah.Key1": 4711}, {"test2": "respo"}]}) == {"Key1": {"Key2": {"Key3(..x)": [{"blah": {"Key1": 4711}}, {"test2": "respo"}]}}}, convert({"Key1.Key2.Key3(..x)": [{"balh.Key1": 4711}, {"test2": "respo"}]})
assert convert({"Key1.Key2.Key3(someparameter.blah = asdfa.ddd)": {"balh.Key1": 4711}}) == {"Key1": {"Key2": {"Key3(someparameter.blah = asdfa.ddd)": {"balh": {"Key1": 4711}}}}} , convert({"Key1.Key2.Key3(someparameter.blah = asdfa.ddd)": {"balh.Key1": 4711}})
尝试使用
递归
。我假设原始数据中不存在元组和集合。不管怎样,你都可以应付
def unpack_str(s,ttype='k'):
kk=[]
num_括号=0
s_splited=s.split(“.”)
如果(len(s_拆分)0):
kk.append(f)“是否总是会有3个键,或者计数可能会增加/减少?它并不总是起作用。请说明什么不起作用,你得到了什么结果,以及为什么它是意外的。键的计数和深度可能不同。例如,它在以下JSON中失败:{“Key1.Key2.Key3(val.id=obj.id)”:{“balh”:4711}==>结果是{'Key1.Key2.Key3':{'Key1':{'Key2':{'Key3(val.id=obj.id)':{'balh:4711}}}}}而不是{'Key1':{'Key2':{'Key3(val.id=obj.id):{'balh:4711}调试一个失败的示例。这几乎是正确的答案,但它不会在listsHey dukee上迭代!谢谢,实际上有些参数可以包含一个点,例如,{'Key1.Key3}(someparameter.blah=asdfa.ddd)“:{“balh.Key1”:4711}}@kruemel4请给出参数和列表(输入和输出结构)的起始帖子示例,我将更新我的解决方案谢谢@dukkee。不幸的是,我无法编辑起始帖子(“建议的编辑队列已满”)。我在这里很新,所以我开始学习它是如何工作的。一些示例是:-{“Key1.Key2.Key3(someparameter)”:{“balh.Key1”:4711}-{“Key1.Key2.Key3(someparameter.key=obj.value)”:{“balh.Key1”:4711}@kruemel4我看不到输出状态。请使用例如或任何其他代码共享工具来编写示例(重要,也请输出转换状态)并在此处写入此链接
{'Key1': {'Key2': {'Key3(someparameter)': {'balh': {'Key1': [{'a1': {'a2': 1},
'b': 2}]}}}}}