Python 将路径转换为字典

Sav*_*vvy -1 python python-3.x

我有一个需要转换为字典的路径列表

[
    "/company/accounts/account1/accountId=11111",
    "/company/accounts/account1/accountName=testacc",
    "/company/accounts/account1/environment=test",
    "/company/accounts/account2/accountId=22222",
    "/company/accounts/account2/accountName=stageacc",
    "/company/accounts/account2/environment=stage",
    "/program/releases/program1/stage/version=1.1",
    "/program/releases/program1/stage/date=2021-02-01",
    "/program/releases/program1/prod/version=1.0",
    "/program/releases/program1/prod/date=2021-01-15",
]
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

{
    "company": {
        "accounts": {
            "account1": {
                "accountId": 11111,
                "accountName": "testacc",
                "environment": "test"
            },
            "account2": {
                "accountId": 22222,
                "accountName": "stageacc",
                "environment": "stage"
            }
        }
    },
    "program": {
        "releases": {
            "program1": {
                "stage": {
                    "version": "1.1",
                    "date": "2021-02-01"
                },
                "prod": {
                    "version": "1.0",
                    "date": "2021-01-15"
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试迭代地解决这个问题,但我似乎无法让它发挥作用。对于嵌套字典,不确定这里的正确方法是什么。

这是我的代码:

class Deserialize:
    def __init__(self):
        self.obj = {}

    def deserialize_iteratively(self, paths):
        
        def helper(path):
            path_elements = path.split('/')
            for e in path_elements[::-1]:
                if "=" in e:
                    k,v = e.split("=")
                    self.obj[k] = v
                else:
                    tmp = {}
                    tmp[e] = self.obj
                    self.obj = tmp
            return self.obj
        
        for path in paths:
            helper(path)
        return self.obj
Run Code Online (Sandbox Code Playgroud)

前两条路径生成的错误输出:

{'': {'company': {'accounts': {'account1': {'': {'company': {'accounts': {'account1': {'accountId': '11111'}}}},
                                            'accountName': 'testacc'}}}}}
Run Code Online (Sandbox Code Playgroud)

AKX*_*AKX 5

.setdefault()当您挖掘路径时,您将需要使用它来创建字典。

from pprint import pprint

s = [
    "/company/accounts/account1/accountId=11111",
    "/company/accounts/account1/accountName=testacc",
    "/company/accounts/account1/environment=test",
    "/company/accounts/account2/accountId=22222",
    "/company/accounts/account2/accountName=stageacc",
    "/company/accounts/account2/environment=stage",
    "/program/releases/program1/stage/version=1.1",
    "/program/releases/program1/stage/date=2021-02-01",
    "/program/releases/program1/prod/version=1.0",
    "/program/releases/program1/prod/date=2021-01-15",
]

root = {}

for path in s:
    # separate by slashes, disregarding the first `/`
    path = path.lstrip("/").split("/")
    # pop off the last key-value component
    key, _, val = path.pop(-1).partition("=")
    # find the target dict starting from the root
    target_dict = root
    for component in path:
        target_dict = target_dict.setdefault(component, {})
    # assign key-value
    target_dict[key] = val

pprint(root)
Run Code Online (Sandbox Code Playgroud)

输出:

{'company': {'accounts': {'account1': {'accountId': '11111',
                                       'accountName': 'testacc',
                                       'environment': 'test'},
                          'account2': {'accountId': '22222',
                                       'accountName': 'stageacc',
                                       'environment': 'stage'}}},
 'program': {'releases': {'program1': {'prod': {'date': '2021-01-15',
                                                'version': '1.0'},
                                       'stage': {'date': '2021-02-01',
                                                 'version': '1.1'}}}}}
Run Code Online (Sandbox Code Playgroud)