首页 > 解决方案 > 如何使用 Python 3 读取嵌套字典中的每个值并在修改值后创建类似的字典

问题描述

我正在尝试做这样的事情。我想读取以下字典中的每个键和值并执行一些操作,例如,找到每个低于90for的值Grade2并将其增加到90. 最后,用这些修改创建另一个字典。

输入:

markssheet = {
  "Schools": {
    "ABCElementarySchool": {
      "Grade1": {
        "Ethan": 92,
        "Joyee": 89
      },
      "Grade2": {
        "Rifat": 92,
        "Jason": 88,
      },
      "Grade3": {
        "Sophia": 95,
        "Hassan": 93,
      }
    },
    "EdisonElementarySchool": {
      "Grade1": {
        "Ethan": 91,
        "Joyee": 90
      },
      "Grade2": {
        "Ethan": 79,
        "John": 92
      }
    }
  }
}

输出:

updated_markssheet = {
  "Schools": {
    "ABCElementarySchool": {
      "Grade1": {
        "Ethan": 92,
        "Joyee": 90
      },
      "Grade2": {
        "Rifat": 92,
        "Jason": 90,
      },
      "Grade3": {
        "Sophia": 95,
        "Hassan": 93,
      }
    },
    "EdisonElementarySchool": {
      "Grade1": {
        "Ethan": 91,
        "Joyee": 90
      },
      "Grade2": {
        "Ethan": 90,
        "John": 92
      }
    }
  }
}

我可以用 4 个不同的for循环key, value和 4 个if条件来完成此操作,但这不是我可以在任何字典中使用的东西。一些值可以在嵌套的更深层次上。在这种情况下,我的代码将不起作用。

所以,我想知道是否可以使用带有递归函数之类的较短循环,以便它适用于任何字典,但我不知道如何。如果任何其他方法适用于任何字典,那也很好。

标签: python-3.xdictionaryrecursion

解决方案


您可以使用递归函数来做到这一点,如下所示:

def transformMap(sheet):
    for k in sheet:
        if isinstance(sheet[k], int) and sheet[k] < 90:
            sheet[k] = 90
        if isinstance(sheet[k], dict):
            transformMap(sheet[k])

请注意,它在不创建另一个字典的情况下更改了字段值。


推荐阅读