我的一个观点中有以下代码。问题是我无法弄清楚如何将它重构为一个for循环。唯一的区别是'项目'。部分。我需要在同一模板中的所有三个变量值,所以我不认为我可以从urls.py传递信息。关于我如何重写这一点的任何想法,所以我不重复自己?
感谢。
def average(request):
cal_list = []
cal_list2 = []
cal_list3 = []
exams = Test.objects.filter(test__test_name__iexact="one")
for item in exams:
cal_list.append(int(item.start))
result = sum(cal_list) / float(165) * 100
result = result / len(cal_list)
result = int(round(result))
result = str(result) + '%'
for item in exams:
cal_list2.append(int(item.s1))
result2 = sum(cal_list2) / float(165) * 100
result2 = result2 / len(cal_list2)
result2 = int(round(result2))
result2 = str(result2) + '%'
for item in exams:
cal_list3.append(int(item.s2))
result3 = sum(cal_list3) / float(165) * 100
result3 = result3 / len(cal_list3)
result3 = int(round(result3))
result3 = str(result3) + '%'
return direct_to_template(request, 'a.html', {'result': result, 'result2': result2, 'result3': result3})
答案 0 :(得分:1)
在你的循环中,你会一直覆盖results
值,因此你可以推断出那部分:
for item in items:
cal_list.append(int(item.start))
cal_list2.append(int(item.s1))
cal_list3.append(int(item.s2))
result = "%s%%" % round((sum(cal_list) / float(165) * 100) / len(cal_list))
result2 = "%s%%" % round((sum(cal_list2) / float(165) * 100) / len(cal_list2))
result3 = "%s%%" % round((sum(cal_list3) / float(165) * 100) / len(cal_list3))
答案 1 :(得分:1)
我只想创建一个函数:
def calculate_result(items):
items = tuple(int(i) for i in items)
result = sum(items) / 16500.0
result = result / len(items)
return '%i' % round(result) + '%'
result0 = calculate_result(item.start for item in exams)
result1 = calculate_result(item.s1 for item in exams)
result2 = calculate_result(item.s2 for item in exams)
答案 2 :(得分:0)
在那里,您可以进行最简单的重构,这样可以保证循环不会仅仅迭代所需的内容并将计算移出循环。
def average(request):
cal_list = []
cal_list2 = []
cal_list3 = []
exams = Test.objects.filter(test__test_name__iexact="one")
for item in exams:
cal_list.append(int(item.start))
cal_list2.append(int(item.s1))
cal_list3.append(int(item.s2))
result = sum(cal_list) / float(165) * 100
result = result / len(cal_list)
result = int(round(result))
result = str(result) + '%'
result2 = sum(cal_list2) / float(165) * 100
result2 = result2 / len(cal_list2)
result2 = int(round(result2))
result2 = str(result2) + '%'
result3 = sum(cal_list3) / float(165) * 100
result3 = result3 / len(cal_list3)
result3 = int(round(result3))
result3 = str(result3) + '%'
return direct_to_template(request, 'a.html', {'result': result, 'result2': result2, 'result3': result3})
答案 3 :(得分:0)
您可以使用aggregate
在数据库层执行求和。
from django.db import models
def average(request):
queryset = Test.objects.filter(test__test_name__iexact="one")
total = queryset.count()
results = queryset.aggregate(
result1=models.Sum('start'),
result2=models.Sum('s1'),
result3=models.Sum('s2'))
def transform(resultsum):
result = resultsum / float(165) * 100
result = result / total
result = int(round(result))
result = str(result) + '%'
return result
result1 = transform(results['result1'])
result2 = transform(results['result2'])
result3 = transform(results['result3'])
return direct_to_template(request, 'a.html', {'result': result1, 'result2': result2, 'result3': result3})