【问题标题】:How iterate over a dictionary of several levels and array of values如何迭代多个级别和值数组的字典
【发布时间】:2021-10-19 14:37:40
【问题描述】:

我有一个由值数组组成的字典,我想获取与条件相关的所有值。这是结构的虚拟样本:

d = {'condition': 'Approval expected.', 'sub_conditions': [
    {'condition': 'Approved Activities: {reading} {crafting}', 'sub_conditions': [
        {'condition': 'Field Areas: # of areas, dimensions - {start_date} {end_date} {email}', 'sub_conditions': [
            {'condition': 'Room Areas: # of rooms, dimensions - {start_date} {end_date} {email}',
             'sub_conditions': []}]}]}]}

subconditions 是由我想获得的条件组成的字典数组。目前,我正在访问每个条件值如下:

for layer_one in d['sub_conditions']:
    print(layer_one['condition'])
    for layer_two in layer_one['sub_conditions']:
        print(layer_two['condition'])
        for layer_three in layer_two['sub_conditions']:
            print(layer_three['condition'])
            #it can have more layers

这给了我需要的输出:

Approved Activities: {reading} {crafting}
Field Areas: # of areas, dimensions - {start_date} {end_date} {email}
Room Areas: # of rooms, dimensions - {start_date} {end_date} {email}

我想知道更好的方法来迭代这种类型的字典。在这种情况下,最好的方法是什么?

【问题讨论】:

  • 字典似乎有一个树结构,其中一个节点有一个特定的字符串值和可能的其他子节点。在您的示例中,每个列表只有一个子元素(因此树只是一个链)。这是否总是正确的,如果不是,您是要一起打印每个级别中的所有条件(广度优先)还是进行深度优先遍历?

标签: python python-3.x list dictionary


【解决方案1】:

当您发现自己不确定嵌套结构可以达到多少层时,请考虑递归。

获取您的代码,并将其修改为递归函数,我们在“父”字典中调用该函数,然后对其中存在的每个“内部”字典进行递归。

def recurse(curr_dict):
    if 'sub_conditions' in curr_dict:
        for inner_dict in curr_dict['sub_conditions']:
            print(inner_dict['condition'])
            recurse(inner_dict)

d = {'condition': 'Approval expected.', 'sub_conditions': [
    {'condition': 'Approved Activities: {reading} {crafting}', 'sub_conditions': [
        {'condition': 'Field Areas: # of areas, dimensions - {start_date} {end_date} {email}', 'sub_conditions': [
            {'condition': 'Room Areas: # of rooms, dimensions - {start_date} {end_date} {email}',
             'sub_conditions': []}]}]}]}
             
recurse(d)

输出与您的代码相同的内容,但现在您不必担心添加更多循环,无论字典嵌套多少层,递归代码都应该工作。

Approved Activities: {reading} {crafting}
Field Areas: # of areas, dimensions - {start_date} {end_date} {email}
Room Areas: # of rooms, dimensions - {start_date} {end_date} {email}

【讨论】:

    【解决方案2】:

    您可以为此使用递归函数:

    d = {'condition': 'Approval expected.', 'sub_conditions': [
        {'condition': 'Approved Activities: {reading} {crafting}', 'sub_conditions': [
            {'condition': 'Field Areas: # of areas, dimensions - {start_date} {end_date} {email}', 'sub_conditions': [
                {'condition': 'Room Areas: # of rooms, dimensions - {start_date} {end_date} {email}',
                 'sub_conditions': []}]}]}]}
    
    
    def print_conditions(my_dict: dict):
        """Print `condition` within each list of `sub_conditions`"""
        for sub_condition in my_dict['sub_conditions']:
            print(sub_condition['condition'])
            print_conditions(sub_condition)
    
    
    print_conditions(d)
    

    输出:

    Approved Activities: {reading} {crafting}
    Field Areas: # of areas, dimensions - {start_date} {end_date} {email}
    Room Areas: # of rooms, dimensions - {start_date} {end_date} {email}
    

    【讨论】:

      【解决方案3】:
      dict_of_conditions = d = {'condition': 'Approval expected.', 'sub_conditions': [
          {'condition': 'Approved Activities: {reading} {crafting}', 'sub_conditions': [
              {'condition': 'Field Areas: # of areas, dimensions - {start_date} {end_date} {email}', 'sub_conditions': [
                  {'condition': 'Room Areas: # of rooms, dimensions - {start_date} {end_date} {email}',
                   'sub_conditions': []}]}]}]}
      
      conditions = []
      def get_conditions(condition_dict):
          print(condition_dict["condition"])
          conditions.append(condition_dict["condition"])
          if len(condition_dict["sub_conditions"]) > 0:
              get_conditions(condition_dict["sub_conditions"][0]) # I am selecting the first item in the "sub_conditions" list because there seems to be only always one item in the array
      

      这称为递归函数。基本上,它接受一个字典,打印条件,如果 sub_conditions 数组的长度大于 0,它会再次调用它自己。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-01-24
        • 2020-11-20
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-05
        相关资源
        最近更新 更多