Изменить ключи и значения во вложенном словаре со списками внутри него - PullRequest
1 голос
/ 24 сентября 2019

Как я могу выполнить итерацию в dict, который содержит дочерние элементы, который содержит список, который содержит больше словарей внутри, и добавить значение, если выполняется какое-то условие

Часть словаря, которую я имею, такова:

{
        "a": "segments",
        "children":
            [{"a": 1,
                "order": "1",
                "price": 1500.0,
                "children":
                    [{
                        "a": "1.1",
                        "order": "2",
                        "price": 75.0,
                        "children": 
                            [{
                                "a": "1.1.1",
                                "order": "3",
                                "price":100.0
                            }]
                    }]

                            // . . . 
                },
                {"a": n,
                "order": "1",
                "price": 100.0,
                "children": 
                        [{
                        "a": "n.1",
                        "order": "2",
                        "price": 1000.0
                        }]
                }]
 }

Я пытался решить эту проблему с помощью различных циклов for в функции, но я не получил желаемого результата.

Что я хочу сделать, так это для каждого ребенка с порядком 1, дойти до последнего ребенка от него и суммировать все цены, затем сделать то же самое для заказа 2 и так до последнего ребенка

Я уже сейчас, что, как это словарь и внутри ключевых детей есть список с большим количеством словарей, я могу сделать несколько циклов, как показано ниже

list_segments = []
first_children = data['children']
for dicts in first_children:

    for segment in dicts['children']:
        list_segments.append(segment)

Но проблема в том, что яне знаю, как создать функцию, которая будет обращаться к следующему дочернему элементу, проходя через все дочерние элементы до конца.

Требуемый вывод должен быть ключом на всех уровнях, как этот:

level_price: price order 1 +price order 2 + price price order 3
    level_price: price order 2 + price price order 3
        level_price: price order 3

1 Ответ

0 голосов
/ 24 сентября 2019

Что бы я сделал, это рекурсивная функция, использующая async с целью ожидания до последнего вложенного уровня, добавляя price:

async def mainfunction(current_level):

    if 'subtree_price' in current_level:
        for child in current_level['children']:
            if 'children' in child:            
                    child = await  mainfunction(child)
    else:     
        current_level = await parentFunction(current_level)       
        if 'children' in current_level:            
            for child in current_level['children']:            
                child = await  mainfunction(child)       
    return current_level

async def parentFunction(current_level):    
    counter = 0    
    if 'price' in current_level:
        if 'children' in current_level:       
            for child in current_level['children']:
                counter += await childfunction(0, child)        
        else:
            current_level['subtree_price'] = current_level['price']           
        current_level['subtree_price'] = counter +  current_level['price']               
    return current_level

async def childfunction(counter, current_level):   
    counter = 0 
    if 'children' in current_level:  
        for child in current_level['children']:
            counter += child['price']
            if 'children' in child:   
                counter += await childfunction(counter, child)        
    return counter + current_level['price']

Первое, что вам нужно сделать, - это подумать оСуммируйте все prices от вашего текущего уровня до последнего уровня.Это можно сделать с помощью childfunction

. mainfunction проверяет, добавил ли ваш текущий уровень (order) общую сумму, сделанную childfunction (проверяя, существует ли subtree_price),Если не существует, вызывается parentfunction, который проверяет, существуют ли потомки.Если они существуют, он выполнит childfunction, и результат будет добавлен к parent на вашем текущем уровне.Если нет, то subtree_price будет вашим собственным price.

Надеюсь, это поможет вам.

...