【问题标题】:Modify keys and values in a nested dictionary with lists inside of it修改嵌套字典中的键和值,其中包含列表
【发布时间】:2019-09-23 21:58:29
【问题描述】:

如何在包含子项的字典中进行迭代,该子项包含一个包含更多字典的列表,并在某些条件完成时添加一个值

我有的字典的一部分是这样的:

{
        "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 做同样的事情,依此类推直到最后一个孩子

我现在已经知道它是一个字典,并且在关键子项内部有一个包含更多字典的列表,我可以执行几个 for 循环,如下所示

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

【问题讨论】:

  • 写一个递归函数。

标签: python list dictionary for-loop nested-loops


【解决方案1】:

我要做的是使用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

希望对你有帮助。

【讨论】:

  • 我刚刚使用了函数,得到了我想要的结果,谢谢
猜你喜欢
  • 2019-07-18
  • 2018-07-10
  • 2018-09-13
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多