摇咩 发表于 2023-9-4 13:24:42

递归遍历嵌套字典

有一个半排序数据,该数据由最近一次测验中学生分数的字典组成。在字典中,键始终是 a0000000 形式的学生编号,而值要么是:代表该学生分数(0...100)的整数,或者包含更多键值对的嵌套字典。例如:
{'a1000000': {'a1000002': 76, 'a1000351': 50, 'a1003202': 59},
'a2000000': {'a2002202': 56,
            'a2002535': 57,
            'a2005452': 79,
            'a2200000': {'a2200354': 65,
                           'a2201029': 80,
                           'a2212332': 12,
                           'a2240000': {'a2249834': 87}}}}
[('a1000002', 76),
('a1000351', 50),
('a1003202', 59),
('a2002202', 56),
('a2002535', 57),
('a2005452', 79),
('a2200354', 65),
('a2201029', 80),
('a2212332', 12),
('a2249834', 87)]写出一个定义为:
def flatten_nested_scores (student_id_score_dict):

isdkz 发表于 2023-9-4 13:25:06

可以使用递归来遍历嵌套字典。首先,我们定义一个空列表来存储结果。然后,我们遍历字典的键值对。如果值是一个整数,我们将其添加到结果列表中。如果值是一个字典,我们将递归调用自己来遍历该字典,并将返回的结果添加到结果列表中。最后,我们将结果列表按照学生 ID 进行排序,并返回结果。

以下是实现这个功能的代码:

def traverse_nested_dict(data):
    result = []
    for key, value in data.items():
      if isinstance(value, int):
            result.append((key, value))
      elif isinstance(value, dict):
            result.extend(traverse_nested_dict(value))
    result.sort(key=lambda x: x)
    return result

data = {
    'a1000000': {
      'a1000002': 76,
      'a1000351': 50,
      'a1003202': 59
    },
    'a2000000': {
      'a2002202': 56,
      'a2002535': 57,
      'a2005452': 79,
      'a2200000': {
            'a2200354': 65,
            'a2201029': 80,
            'a2212332': 12,
            'a2240000': {
                'a2249834': 87
            }
      }
    }
}

result = traverse_nested_dict(data)
print(result)


输出结果为:

[('a1000002', 76), ('a1000351', 50), ('a1003202', 59), ('a2002202', 56), ('a2002535', 57), ('a2005452', 79), ('a2200354', 65), ('a2201029', 80), ('a2212332', 12), ('a2249834', 87)]


这个结果是按照学生 ID 排序的元组列表,每个元组包含学生 ID 和分数。
页: [1]
查看完整版本: 递归遍历嵌套字典