如何从值为列表的字典生成目标字典列表?
如何从值为列表的字典生成字典列表?
输入
ip = {'Science' : [88, 89], 'Arts' : [77, 78] }
预期输出
op = [{'Science' : 88, 'Arts' : 77}, {'Science' : 89, 'Arts' : 78}]
尝试代码
op = [] for i, j in zip(ip.keys(), ip.values()): op.append({i:j[0]}) op.append({i:j[1]}) print(op)
当前输出
[{'Science': 88}, {'Science': 89}, {'Arts': 77}, {'Arts': 78}]
解决方案
你的代码问题在于每次循环仅将单个学科的单个分数以字典形式加入列表,没有把同一位置的不同学科分数合并为一个字典。以下是两种可行的解决方法:
方法一:利用zip打包分数列表(简洁写法)
ip = {'Science': [88, 89], 'Arts': [77, 78]} # 获取所有学科名称,打包各学科对应位置的分数 subjects = ip.keys() score_groups = zip(*ip.values()) # 遍历打包后的分数组,生成对应字典 op = [dict(zip(subjects, scores)) for scores in score_groups] print(op)
方法二:索引遍历(直观易懂)
ip = {'Science': [88, 89], 'Arts': [77, 78]} op = [] # 假设所有学科的分数列表长度一致,取第一个列表的长度作为循环次数 total_students = len(next(iter(ip.values()))) for idx in range(total_students): student_scores = {} for subject, scores in ip.items(): student_scores[subject] = scores[idx] op.append(student_scores) print(op)
两种方法均能输出预期结果,第一种借助列表推导式和zip特性更简洁,第二种通过索引遍历逻辑更直观,适合理解基础循环原理。
内容的提问来源于stack exchange,提问作者Shivasiddharth Narayanan
相关产品推荐
相关产品推荐

