使用For-Loops Python创建动态嵌套Json

2024-09-30 18:34:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用for循环创建一个嵌套的json,json值是动态的,子对象的长度可以变化,没有固定的长度,结构也应该是

BuildingGroup
  Building1
   Ward
    Room
     Bed
   Ward
   Ward
     Room
       Bed
       Bed

BuildingGroup始终是根节点,但是子节点可能会有所不同,我需要使用paramaters动态添加子节点。这就是我目前所拥有的。在

^{pr2}$

Create_tree()应该创建一个名为'Ward1'的病房,并将10Rooms添加到Ward1

输出。在

{'BuildingGroup': defaultdict(<function create_tree.<locals>.<lambda> at 0x000002054A7AE510>, {'Building1': defaultdict(<function create_tree.<locals>.<lambda> at 0x000002054A7AE510>, {'Ward1': defaultdict(<function create_tree.<locals>.<lambda> at 0x000002054A7AE510>, {'Room1': 1})})})})

第一次迭代有效,但是在第一次迭代之后,我得到了这个错误。在

TypeError: 'int' object does not support item assignment

Tags: lambdajsontree节点create动态functionat
1条回答
网友
1楼 · 发布于 2024-09-30 18:34:36

我调试了你的代码,有点奇怪,但我解决了。您的代码只适用于一个Ward目前,我已经编写了自己的版本,向您展示了一种对多个病房执行此操作的方法。在

我对你的代码进行了注释,向你展示了主要的变化。在

import collections
def add_element(root, path, data):
    if len(path) == 1:
        root[path[0]] = data
    else:
        add_element(root[path[0]], path[1:], data)


def create_tree(Wards,WardName,Rooms):
    count = 1
    ward_list=[]
    room_list= []
    tree = lambda: collections.defaultdict(tree)
    root = tree()
    path_list= ['BuildingGroup', 'Building1']
    for i in range(1,Wards):
        Ward = 'Ward' + str(count)
        # Check your typos, this line had a ',' in it instead of a '.'
        path_list.append(Ward)
        ward_list.append(Ward)
        print (ward_list)
        print (path_list)
        count += 1
        add_element(root,path_list, 1 )
    path_list.append(WardName)
    for i in range(1, Rooms):
        # Initialise room_list with the path_list from the ward
        room_list = path_list.copy()
        # We have a new variable, 'i' for counting rooms, so don't use 'count' here as it never changes
        Room = 'Room' + str(i)
        # path_list.append(Room) - No! Bad! Don't change the path_list, this is the same for each room
        room_list.append(Room)
        # Use the room_list here instead of the path_list
        add_element(root,room_list, 1 )
        print(root)

my_tree = create_tree(1, 'Ward1', 10)

下面是我的版本:

^{pr2}$

相关问题 更多 >