在python中查找平均值(json)

2024-09-25 04:19:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个JSON,如下所示:

[
  [
    {
      "subject": "Subject_1",
      "qapali_correct_count": "12"
    },
    {
      "subject": "Subject_2",
      "qapali_correct_count": "9"
    }
  ],
  [
    {
      "subject": "Subject_1",
      "qapali_correct_count": "14"
    },
    {
      "subject": "Subject_2",
      "qapali_correct_count": "15"
    }
  ],
  [
    {
      "subject": "Subject_1",
      "qapali_correct_count": "11"
    },
    {
      "subject": "Subject_2",
      "qapali_correct_count": "12"
    }
  ]
]

我必须输出每个主题的平均值:例如:subject_1=12.33,subject_2=12 我试过这段代码,它是有效的,但我只是想知道是否有任何选项来加速这段代码,是否有其他有效的方法来实现它

results = Result.objects.filter(exam=obj_exam, grade=obj_grade)
student_count = results.count()
final_data = {}
for result in results:
    st_naswer_js = json.loads(result.student_answer_data_finish)
    for rslt in st_naswer_js:
        previus_data = final_data.get(rslt['subject'],0)
        previus_data = previus_data+int(rslt['qapali_correct_count'])
        final_data.update({rslt['subject']:previus_data})

for dudu, data in final_data.items():
    tmp_data = data/student_count
    final_data[dudu]=tmp_data
print(final_data)

请注意,这是一个Django项目


Tags: 代码infordatacountstudentresultsfinal
1条回答
网友
1楼 · 发布于 2024-09-25 04:19:01

你问题中的代码有几个不相关的位。我将坚持这一部分:

I have to output every subject's average: for example: subject_1 = 12.33, subject_2=12

我假设上面的结果列表位于一个名为results的列表中。如果每个学生都加载了json,那么在现有代码中可能已经有了处理方法。下面主要关注的是subject_score

将每个科目的分数存储在字典中,字典的值是分数列表。我在这里使用一个^{},以list作为默认工厂,因此当访问不存在的字典值时,它会被初始化为一个空列表(而不是抛出一个在标准字典中会发生的键错误)

import collections

subject_score = collections.defaultdict(list)

for result in results:
    for stud_score in result:
        # add each score to the list of scores for that subject
        # use int or float above as needed
        subject_score[stud_score['subject']].append(int(stud_score['qapali_correct_count']))

# `subject_score` is now:
# defaultdict(list, {'Subject_1': [12, 14, 11], 'Subject_2': [9, 15, 12]})

averages = {sub: sum(scores)/len(scores) for sub, scores in subject_score.items()}

averages是:

{'Subject_1': 12.333333333333334, 'Subject_2': 12.0}

也可以根据需要打印或保存到文件、数据库等

相关问题 更多 >