0

私の見解の1つに次のコードがあります。問題は、それを1つのforループにリファクタリングする方法がわからないことです。唯一の違いは「アイテム」です。部。同じテンプレートに3つの変数値がすべて必要なので、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})
4

4 に答える 4

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))
于 2012-10-14T04:13:02.480 に答える
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)
于 2012-10-14T04:13:38.063 に答える
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})
于 2012-10-14T04:09:23.920 に答える
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})
于 2012-10-14T04:37:14.647 に答える