在python中如何通过用点分隔的键拆分/转换字典

在python中如何通过用点分隔的键拆分/转换字典,python,algorithm,dictionary,Python,Algorithm,Dictionary,我有一个字典(或JSON对象),如下所示: {"Key1.Key2.Key3(someparameter)": {"balh.Key1": 4711}} 我想将其转换为一个dict,在python中如下所示: {"Key1": {"key2": {"Key3(someparameter)": {"balh":

我有一个字典(或JSON对象),如下所示:

{"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}]}}}}}