【问题标题】:Find Average in python(json)在 python(json) 中查找平均值
【发布时间】:2021-04-11 08:45:35
【问题描述】:

我有一个如下的 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 项目。

【问题讨论】:

  • "请注意这是一个 Django 项目。"你认为这对这个特定问题的代码很重要吗?为什么?
  • student_answer_data_finishCharField 吗?您可以使用JsonField 来防止序列化和反序列化。
  • 是的,它是一个 CharField,感谢您的建议

标签: python json for-loop


【解决方案1】:

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

我必须输出每个主题的平均值:例如:subject_1 = 12.33, subject_2=12

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

将每个主题的分数存储在字典中,其值是分数列表。我在这里使用defaultdictlist 作为默认工厂,因此当访问一个不存在的字典值时,它会被初始化为一个空列表(而不是抛出一个标准错误会发生的 KeyError字典。

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}

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

【讨论】:

  • 感谢您的建议