【问题标题】:Recursive function nested dictionary python递归函数嵌套字典python
【发布时间】:2021-12-04 07:20:47
【问题描述】:

我需要调用一个递归函数来打印嵌套字典的内容,如下所示:

lunch : {"sandwich": 2, "chips": 1, "drink": 1}

dinner : {"ribs": 6, "mac_cheese": 1, "roll": 1, "pie": 1}

我尝试了以下代码,但它只是迭代嵌套字典的键

# recursive function for printing out meal plans 
def print_meals(meal_plan):
    for key, value in meal_plan.items():
        if type(value) is dict:
            print_meals(value)
        else:
            print(key, ":", value)

    # create an empty dictionary
    meal_plan = {}

    # create individual dictionaries for each meal
    lunch = {"sandwich": 2, "chips": 1, "drink": 1}
    dinner = {"ribs": 6, "mac_cheese": 1, "roll": 1, "pie": 1}

    #create a nested dictionary
    meal_plan["lunch"] = lunch 
    meal_plan["dinner"] = dinner 

    # call recursive function 'print_meals'
    print_meals(meal_plan)

【问题讨论】:

  • 输入中的嵌套字典在哪里?我可以看到,都是普通的字典。
  • @JohnByro 我正在创建嵌套字典的注释下创建嵌套字典。它被存储在字典 meal_plan
  • 是否保证嵌套字典中只有一层深度?或者你可以有例如meal_plan = {'monday': {'lunch': {...}, 'dinner': {...}}, 'tuesday': {...}}
  • 我建议使用isinstance(value, dict) 而不是type(value) is dict。例如,如果valuedict 的子类,那么isinstance(value, dict) 仍将返回True,但type(value) is dict 将返回False
  • 如果没有任意级别的嵌套,则不需要递归。

标签: python dictionary recursion


【解决方案1】:

你可以像下面这样定义你的function

>>> def print_meals(dct):
...    for k,v in dct.items():
...        print(f'{k} : {v}');print()

输出:

>>> meal_plan
{'lunch': {'sandwich': 2, 'chips': 1, 'drink': 1},
 'dinner': {'ribs': 6, 'mac_cheese': 1, 'roll': 1, 'pie': 1}}

>>> print_meals(meal_plan)
lunch : {'sandwich': 2, 'chips': 1, 'drink': 1}

dinner : {'ribs': 6, 'mac_cheese': 1, 'roll': 1, 'pie': 1}

【讨论】:

    【解决方案2】:

    这是一个想法:

    def print_meals(meal_plan, depth=0):
        if isinstance(meal_plan, dict):
            for k, v in meal_plan.items():
                print('  '*depth, k, ':')
                print_meals(v, depth+1)
        else:
            print('  '*depth, meal_plan)
    
    print_meals('sandwich')
    #  sandwich
    
    print_meals({'sandwich': 1})
    #  sandwich :
    #    1
    
    print_meals({'lunch': {'sandwich': 2, 'chips': 1, 'drink': 1}, 'dinner': {'ribs': 6, 'mac_cheese': 1, 'roll': 1, 'pie': 1}})
    #  lunch :
    #    sandwich :
    #      2
    #    chips :
    #      1
    #    drink :
    #      1
    #  dinner :
    #    ribs :
    #      6
    #    mac_cheese :
    #      1
    #    roll :
    #      1
    #    pie :
    #      1
    
    print_meals({'monday': {'lunch': {'sandwich': 1, 'apple': 2}, 'dinner': {'soup': 1, 'yaourt': 1}}, 'tuesday': {'breakfast': 'pain au chocolat', 'lunch': {'salad': 2, 'lasagna': 1}, 'dinner': {'beans':3}}})
    #  monday :
    #    lunch :
    #      sandwich :
    #        1
    #      apple :
    #        2
    #    dinner :
    #      soup :
    #        1
    #      yaourt :
    #        1
    #  tuesday :
    #    breakfast :
    #      pain au chocolat
    #    lunch :
    #      salad :
    #        2
    #      lasagna :
    #        1
    #    dinner :
    #      beans :
    #        3
    

    或者,为了减少换行符,但假设膳食计划是一个字典:

    def print_meals(meal_plan, depth=0):
      for k,v in meal_plan.items():
        if isinstance(v, dict):
          print('  '*depth, k, ':')
          print_meals(v, depth+1)
        else:
          print('  '*depth, k, ':', v)
    
    print_meals({'sandwich': 1})
    #  sandwich : 1
    
    print_meals({'lunch': {'sandwich': 2, 'chips': 1, 'drink': 1}, 'dinner': {'ribs': 6, 'mac_cheese': 1, 'roll': 1, 'pie': 1}})
    #  lunch :
    #    sandwich : 2
    #    chips : 1
    #    drink : 1
    #  dinner :
    #    ribs : 6
    #    mac_cheese : 1
    #    roll : 1
    #    pie : 1
    
    print_meals({'monday': {'lunch': {'sandwich': 1, 'apple': 2}, 'dinner': {'soup': 1, 'yaourt': 1}}, 'tuesday': {'breakfast': 'pain au chocolat', 'lunch': {'salad': 2, 'lasagna': 1}, 'dinner': {'beans':3}}})
    #  monday :
    #    lunch :
    #      sandwich : 1
    #      apple : 2
    #    dinner :
    #      soup : 1
    #      yaourt : 1
    #  tuesday :
    #    breakfast : pain au chocolat
    #    lunch :
    #      salad : 2
    #      lasagna : 1
    #    dinner :
    #      beans : 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 2021-11-01
      • 2017-02-16
      相关资源
      最近更新 更多