Создание динамического вложенного Json, использующего для циклов - Python - PullRequest
0 голосов
/ 28 ноября 2018

Я пытаюсь создать вложенный json, используя циклы for. Значения Json являются динамическими, а длина дочерних элементов может варьироваться без фиксированной длины. Также структура должна быть

BuildingGroup
  Building1
   Ward
    Room
     Bed
   Ward
   Ward
     Room
       Bed
       Bed

BuildingGroupвсегда является корневым узлом, но дети могут различаться. Мне нужно динамически добавлять детей с помощью параметров.Это то, что у меня есть.

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)
        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):
        Room = 'Room' + str(count)
        path_list.append(Room)

        room_list.append(Room)
        print (root)
        add_element(root,path_list, 1 )

create_tree(1, 'Ward1', 10)

Create_tree () должен создать одну палату с именем 'Ward1' и добавить 10 Rooms к Ward1

Ouput.

{'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

1 Ответ

0 голосов
/ 28 ноября 2018

Я отлаживал твой код, это было довольно странно, но я решил это.На данный момент ваш код работает только для одного 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)

Теперь вот моя версия:

import json


def create_tree(ward_list, number_of_rooms):
    tree = {'BuildingGroup': {'Building1': {}}}
    for ward in ward_list:
        tree['BuildingGroup']['Building1'][ward] = []
        for i in range(1, number_of_rooms + 1):
            tree['BuildingGroup']['Building1'][ward].append("Room" + str(i))
    return tree


wards = ['Ward1', 'Ward2']
my_tree = create_tree(wards, 10)
tree_json = json.dumps(my_tree)
print(tree_json)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...