python-3.x - 如何使用 Python 3 读取嵌套字典中的每个值并在修改值后创建类似的字典
问题描述
我正在尝试做这样的事情。我想读取以下字典中的每个键和值并执行一些操作,例如,找到每个低于90
for的值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
条件来完成此操作,但这不是我可以在任何字典中使用的东西。一些值可以在嵌套的更深层次上。在这种情况下,我的代码将不起作用。
所以,我想知道是否可以使用带有递归函数之类的较短循环,以便它适用于任何字典,但我不知道如何。如果任何其他方法适用于任何字典,那也很好。
解决方案
您可以使用递归函数来做到这一点,如下所示:
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])
请注意,它在不创建另一个字典的情况下更改了字段值。
推荐阅读
- android - 如何防止 READ_PHONE_STATE Android 权限
- reactjs - 什么是 redux 中的 props 方法是如何附加到它的
- ios - 在 UITableView 中只播放一个 AVPlayer 视频
- ios - 关闭 AVPlayerViewController 不会“杀死”对象 - 它会持续存在
- git - 我在 GitHub 上合并了一个拉取请求,我必须更改该提交的作者。如何?
- cmake - 如何使用 Homebrew 安装 cmake 3.12 版
- jquery - 使用 webpacker 和 coffeescript 未触发 jquery 事件
- excel - Excel VBA函数返回一个工作链接到文书工作
- xamarin - 在 ListView(Xamarin Forms)上滚动项目时如何计算位置值(高度)?
- c - 如何将复数(复整数)与C中的整数相乘?