动态构建Python字典不会返回所需的结果

动态构建Python字典不会返回所需的结果,python,json,python-3.x,dictionary,Python,Json,Python 3.x,Dictionary,我正在尝试用Python 3.7编写一个类ResourcesBuilder,它: 获取一些JSON数据: 帐户:父帐户和子帐户的字典和列表 服务:一些字符串标识符 数据:可以是字典、列表或字符串 使用输入数据动态构建嵌套字典,并将其作为JSON返回 导入json 类资源生成器: 定义初始化(自): self.parent_帐户={} self.accounts={} def生成(自我、父帐户、子帐户、服务、数据): self.parent_帐户[子_帐户]={service:data}

我正在尝试用Python 3.7编写一个类
ResourcesBuilder
,它:

  • 获取一些JSON数据:
    • 帐户
      :父帐户和子帐户的字典和列表
    • 服务
      :一些字符串标识符
    • 数据
      :可以是字典、列表或字符串
  • 使用输入数据动态构建嵌套字典,并将其作为JSON返回
导入json
类资源生成器:
定义初始化(自):
self.parent_帐户={}
self.accounts={}
def生成(自我、父帐户、子帐户、服务、数据):
self.parent_帐户[子_帐户]={service:data}
self.accounts[parent\u account]=self.parent\u account
def main():
accounts=json.loads(“{”p_acc_1“:[“c_acc_1a”,“c_acc_1b”],“p_acc_2”:[“c_acc_2a”,“c_acc_2b”]})
服务='测试服务'
builder=ResourcesBuilder()
对于帐户中的父帐户:
对于帐户[父帐户]中的帐户:
数据='测试数据'
builder.build(父帐户、a帐户、服务、数据)
打印(json.dumps(builder.accounts,缩进=4,排序键=True))
如果名称=“\uuuuu main\uuuuuuuu”:
main()
运行时,上述代码当前返回:

##当前结果
{
“p_acc_1”:{
“c_acc_1a”:{
“测试服务”:“测试数据”
},
“c_acc_1b”:{
“测试服务”:“测试数据”
},
“c_acc_2a”:{

“测试服务”:“测试数据”基本上在
构建功能的第二步中,您基本上是将您创建的整个词典链接回帐户。您只需复制属于您分配给的父级的子级词典
self.accounts[父级\u帐户]
。由于在子项列表上的
for
循环中,无法一次显式获取所有子项数据,因此需要创建一个链接父词典的新函数

import json


class ResourcesBuilder:
    def __init__(self):
        self.parent_account = {}
        self.accounts = {}

    def build(self, parent_account, child_account, service, data):
        self.parent_account[child_account] = {service: data}

    # This function links the parent correctly
    # i.e., link only those dictionaries which are children of the
    # current parent
    def link_parent(self, parent_account, child_list):
        self.accounts[parent_account] = {k: self.parent_account[k] 
                                         for k in child_list}


def main():
    accounts = json.loads('{"p_acc_1": ["c_acc_1a", "c_acc_1b"], "p_acc_2": ["c_acc_2a", "c_acc_2b"]}')
    service = 'test_service'
    builder = ResourcesBuilder()
    for parent_account in accounts:
        for a_account in accounts[parent_account]:
            data = 'test_data'
            builder.build(parent_account, a_account, service, data)

        # Now once the children nodes have been created, link the parent
        builder.link_parent(parent_account, accounts[parent_account])
    print(json.dumps(builder.accounts, indent=4, sort_keys=True))


if __name__ == "__main__":
    main()

您可以参考工作代码以了解更多信息。

您几乎就到了,伙计,只需在父循环的每次迭代中清除父帐户即可

import json


class ResourcesBuilder:
    def __init__(self):
        self.parent_account = {}
        self.accounts = {}

    def build(self, parent_account, child_account, service, data):
        self.parent_account[child_account] = {service: data}
        self.accounts[parent_account] = self.parent_account


def main():
    accounts = json.loads('{"p_acc_1": ["c_acc_1a", "c_acc_1b"], "p_acc_2": ["c_acc_2a", "c_acc_2b"]}')
    service = 'test_service'
    builder = ResourcesBuilder()
    for parent_account in accounts:
        for a_account in accounts[parent_account]:
            data = 'test_data'
            builder.build(parent_account, a_account, service, data)
        builder.parent_account = {}  ## Here I've made change
    print(json.dumps(builder.accounts, indent=4, sort_keys=True))


if __name__ == "__main__":
    main()

这两个答案(纳伦德拉和穆罕默德的答案)都是正确和有用的,如果我可以的话,我会选择它们作为答案:)! 最终选择了Narendra,因为它对我这个初学者来说更为明确。 穆罕默德,对不起,我没有因为我的无知而选择你的答案

更新:在仔细研究了穆罕默德的答案后,我决定更优雅地处理这个问题,尽管这对于新手来说并不明显

非常感谢两位