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)
.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)
| 归档时间: |
|
| 查看次数: |
644 次 |
| 最近记录: |