解决方案
def traverse_take_field(data, fields, values=[], currentKey=None):
"""遍历嵌套字典列表,取出某些字段的值
:param data: 嵌套字典列表
:param fields: 列表,某些字段
:param values: 返回的值
:param currentKey: 当前的键值
:return: 列表
"""
if isinstance(data, list):
for i in data:
traverse_take_field(i, fields, values, currentKey)
elif isinstance(data, dict):
for key, value in data.items():
traverse_take_field(value, fields, values, key)
else:
if currentKey in fields:
values.append(data)
return values
data = {"info": "2班成绩单",
"grades": {
"小明":
[{"chinese": 60}, {"math": 80}, {"english": 100}],
"小红":
[{"chinese": 90}, {"math": 70}, {"english": 50}],
"小蓝":
[{"chinese": 80}, {"math": 80}, {"english": 80}],
},
"newGrades": {
"info": "新增数据",
"newChinese": 77
}}
fields = ["chinese", "newChinese"]
scores = traverse_take_field(data, fields)
print("语文平均成绩为", sum(scores) / len(scores))
平均成绩为 76.75
注意
- 取出的值顺序与fields指定的顺序无关。
- 第二个参数是列表。
- 由于函数使用递归,没有做垃圾回收,该函数会保留中间变量,所以每次调用前重新声明该函数。
参考文献
- Python嵌套字典列表的递归遍历