Проверка экзамена по python

#python #python-3.x

#python #python-3.x

Вопрос:

Я пытаюсь решить этот вопрос:

Первый входной массив является ключом к правильным ответам на экзамен, например ["a", "a", "b", "d"] . Второй содержит представленные ответы студента.

Два массива не являются пустыми и имеют одинаковую длину. Верните оценку для этого массива ответов, указав 4 за каждый правильный ответ, -1 за каждый неправильный ответ и 0 за каждый пустой ответ, представленный в виде пустой строки (в C используется символ пробела).

Я продолжаю получать это сообщение об ошибке для этого кода:

 UnboundLocalError: local variable 'i' referenced before assignment
 

И это мой код:

 def check_exam(arr1, arr2):
    res = 0
    for i in arr1[i]:
        while arr2[i] != "":
            if arr2[i] == arr1[i]:
                res  = 4
            else:
                res -= 1
    return res
    
print(check_exam(["a", "a", "b", "b"], ["a", "c", "b", "d"]))
 

Комментарии:

1. Ну, а кем ты хочешь arr[i] стать? i на данный момент он еще не определен. Он доступен только внутри цикла. Ты это имел в виду for i in range(len(arr1)): ?

2. Здесь нет необходимости использовать два цикла. Достаточно одного.

Ответ №1:

Ошибка связана с for i in arr[i] тем, что вы используете as i до его объявления.

Я решил проблему таким образом:

 def check_exam(arr1, arr2):
res = 0

#As len(arr1) = len(arr2) I choose one of them.
for i in range(len(arr1)):

    if arr1[i] != arr2[i]:

        if arr2[i] != "": res-=1
        else: res =0 #Blank answer.

    elif arr1[i] == arr2[i]: res =4

return res

print(check_exam(["a","a","b","b"],["a","c","b","d"]))
 

Вы можете просто сравнить элементы двух массивов, которые имеют одинаковый индекс, используя for i in range(len(<one of the two arrays>)) .

Ответ №2:

Вы повторяете неправильно. Было бы лучше выполнять итерацию по индексу вместо прямых значений, поскольку здесь оба массива имеют одинаковую длину.

 def check_exam(arr1,arr2):
    res = 0
    for i in range(len(arr1)):
        if arr2[i] == arr1[i]:
            res  = 4
        elif arr[2] == '':
            continue
        else:
            res -= 1
    return res
    


print(check_exam(["a", "a", "b", "b"], ["a", "c", "b", "d"]))
 

Комментарии:

1. Было бы еще лучше использовать zip

2. @Tomerikoo мой плохой на прохождении

Ответ №3:

Вы можете использовать zip :

 def check_exam(arr1, arr2):
    res = 0
    for i, j in zip(arr1, arr2):
        if i == j:
            res  = 4
        elif i:
            res -= 1
    return res
    
print(check_exam(["a", "a", "b", "b"], ["a", "c", "b", "d"]))
 

Вывод:

 6
 

Объяснение:

zip Функция принимает несколько итераций и перебирает их последовательно, а не по одной за раз, что позволяет нам сравнивать каждый элемент одного и того же индекса.