Как сравнить элементы списка для пустого элемента?

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

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

Например:

checkExam(["a", "a", "b", "b"], ["a", "c", "b", "d"]) → 6
checkExam(["a", "a", "c", "b"], ["a", "a", "b",  ""]) → 7

Мое решение: он отлично работает для всех других условий:

def checkExam(arr1,arr2):
    total = 0
    for i,j in zip(arr1, arr2):
        if i == j:
            total += 4
        if i != j:
            total -= 1
        if total < 0:
            return 0
    return total

** Кроме этого:

checkExam(["a", "a", "c", "b"], ["a", "a", "b",  ""]) → 7

Проблема в том, что я не знаю, как сравнивать ("b") с ("") (пустой элемент), поэтому он возвращает +0 для пустого ответа.

**

То есть, если из 100 ответов я дам все правильные, кроме первого, моя оценка будет равна 0? Это не кажется справедливым. (check_exam(['a'] * 100, ['b'] + ['a'] * 99) возвращает 0)

superb rain 11.12.2020 17:07

вы можете просто проверить j== '', чтобы проверить пустую строку

Tony Suffolk 66 11.12.2020 17:12

Кстати, называть ваши аргументы arr1 и arr2 нехорошо - постарайтесь выбрать лучшие имена переменных, это хорошая привычка использовать осмысленные имена. Я бы предложил переименовать arr1 в correct_answers, а arr2 переименовать в given_answers. и что i и j должны быть correct и given соответственно. Наконец, я думаю, что ваш окончательный if, который проверяет отрицательный результат, должен быть вне вашего цикла - в настоящее время он выходит из функции, как только сумма становится отрицательной - что может произойти, когда первый ответ неверный.

Tony Suffolk 66 11.12.2020 17:16

Да спасибо наверное так и сделаю. Это была глупая ошибка.

iamcoder 11.12.2020 17:20
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
4
123
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Почему вы возвращаетесь из цикла, когда получаете отрицательную сумму? Просто примените логику, как указано:

def check_exam(arr1, arr2):
    total = 0
    for i, j in zip(arr1, arr2):
        if i == j:
            total += 4
        elif j:  # only deduct if j is non-emtpy
            total -= 1  
    return max(total, 0)  # no negative marks

>>> check_exam(["a", "a", "b", "b"], ["a", "c", "b", "d"])
6
>>> check_exam(["a", "a", "c", "b"], ["a", "a", "b",  ""])
7

И если вы действительно хотите загадочную однострочную строку:

def check_exam(arr1, arr2):
    return max(0, sum(4*(i==j) or -bool(j) for i, j in zip(arr1, arr2)))
    # or less cryptic
    return max(0, sum(4 if i==j else -1 for i, j in zip(arr1, arr2) if j))

ваш код в конечном итоге даст отрицательные оценки, которые, я думаю, ему не нужны

Sachin Rajput 11.12.2020 17:12

Спасибо теперь понял.

iamcoder 11.12.2020 17:15

Как насчет незашифрованного oneliner? Прямой вариант длиннее всего на два символа.

superb rain 11.12.2020 17:24

попробуйте это, я думаю, это решит вашу проблему .. дайте мне знать, если это не так. даже я новичок в этом, поэтому любая помощь в улучшении кода будет отличной

def check_exam(arr1,arr2):
    total = 0
    for i,j in zip(arr1, arr2):
        if i == j:
            total += 4
        elif j= = "": #i have made a change here
            total += 0
        elif i != j:
            total -= 1
    return max(total,0)

Спасибо, братан, теперь все понятно.

iamcoder 11.12.2020 17:14

Это даст вам то, что вы хотите

def check_exam(solution, student_submit): 
  scores = [0 if y == "" else 4 if (y==x) else -1 for (x,y) in zip(solution,student_submit)]
  return max(sum(scores),0)

теперь добавлен оператор возврата

d-xa 11.12.2020 17:18

Также он возвращает отрицательные баллы, которые должны быть нормализованы до нуля.

Tony Suffolk 66 11.12.2020 17:18

Спасибо @TonySuffolk66 пропустил эту часть вопроса, добавил это сейчас

d-xa 11.12.2020 17:22

ваша версия вычисляет сумму дважды, что не очень хорошо....

Tony Suffolk 66 11.12.2020 18:09

Вы также можете сделать это, как в реальной жизни. Вы знаете, на бумаге. Где вы вообще не сравните неданный ответ с ожидаемым ответом. Где вы бы пропустить это полностью.

def check_exam(expect, given):
    total = 0
    for e, g in zip(expect, given):
        if g:
            total += 4 if e == g else -1
    return max(0, total)

Однострочная версия:

def check_exam(expect, given):
    return max(0, sum(4 if e == g else -1 for e, g in zip(expect, given)))

Другие однострочные:

def check_exam(expect, given):
    return max(0, sum((-1, 4)[e == g] for e, g in zip(expect, given)))
def check_exam(expect, given):
    return max(0, sum(f'    {e}'.find(g) for e, g in zip(expect, given)))

Последний также будет правильно обрабатывать ' ' (ну, как ''):

>>> check_exam(['a', 'a', 'a', 'a'], ['a', 'b', '', ' '])
3

Другие вопросы по теме