鱼C论坛

 找回密码
 立即注册
查看: 2219|回复: 1

递归遍历嵌套字典

[复制链接]
发表于 2023-9-4 13:24:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-9-4 13:25:06 | 显示全部楼层
可以使用递归来遍历嵌套字典。首先,我们定义一个空列表来存储结果。然后,我们遍历字典的键值对。如果值是一个整数,我们将其添加到结果列表中。如果值是一个字典,我们将递归调用自己来遍历该字典,并将返回的结果添加到结果列表中。最后,我们将结果列表按照学生 ID 进行排序,并返回结果。

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

  1. def traverse_nested_dict(data):
  2.     result = []
  3.     for key, value in data.items():
  4.         if isinstance(value, int):
  5.             result.append((key, value))
  6.         elif isinstance(value, dict):
  7.             result.extend(traverse_nested_dict(value))
  8.     result.sort(key=lambda x: x[0])
  9.     return result

  10. data = {
  11.     'a1000000': {
  12.         'a1000002': 76,
  13.         'a1000351': 50,
  14.         'a1003202': 59
  15.     },
  16.     'a2000000': {
  17.         'a2002202': 56,
  18.         'a2002535': 57,
  19.         'a2005452': 79,
  20.         'a2200000': {
  21.             'a2200354': 65,
  22.             'a2201029': 80,
  23.             'a2212332': 12,
  24.             'a2240000': {
  25.                 'a2249834': 87
  26.             }
  27.         }
  28.     }
  29. }

  30. result = traverse_nested_dict(data)
  31. print(result)
复制代码


输出结果为:

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


这个结果是按照学生 ID 排序的元组列表,每个元组包含学生 ID 和分数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-22 19:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表