Ошибка атрибутов в Python(Игра-викторина, импорт словаря)

#python #attributeerror

Вопрос:

Я делаю игру-викторину на python, и у меня есть некоторые проблемы. Вопросы и ответы импортируются из словаря в другом файле python. Но я столкнулся с этой ошибкой:

верните правильный.полоса().нижний() == ответ.полоса().нижний()
Ошибка атрибута: объект «список» не имеет атрибута «полоса»

Я думаю, я понимаю, что проблема в том, что полоса и ниже могут быть применены только к строкам, но я не знаю, куда ее поместить в другом месте?

 from questions import quiz

print("------ Welcome to Python quiz ------")


def compare_answer(correct: str, answer: str) -> bool:
    return correct.strip().lower() == answer.strip().lower()


score = 0
for question in quiz:
    print(quiz[question]['question'])
    user_answer = input("> ")
    correct_answer = quiz[question]["answer"]
    if compare_answer(correct_answer, user_answer):
        score  = 1
        print(f"Right!")
    else:
        print(f"Wrong, the right answer is: {correct_answer}")
print(f"You got {score} of 3 possible right!")
 

Это один из вопросов из словаря

 quiz = {
    1: {
        "question": "Question 1. Which function is used to print out things?"
                    " n 1. input n 2. print n 3. len",
        "answer": [{"answer": "2",
                    "correct": True},
                   {"answer": "print",
                    "correct": True}]

       
    },
 

Ответ №1:

quiz[question]["answer"] , a.k.a correct_answer или correct внутри функции находится список (словарей), а не строка. Ошибка означает именно то, что она говорит: вы не можете позвонить .strip() по списку. Вы хотите проверить, равен ли какой-либо из ответов в correct answer

Каждый элемент correct является словарем формы

 {"answer": "2",
"correct": True}
 

Вам нужно проверить, есть ли в каком-либо из этих словарей "answer" ключ, равный ответу пользователя, а также True значение в "correct" ключе

 def compare_answer(correct: list, answer: str) -> bool:
    return any(ca["correct"] and ca["answer"].strip().lower() == answer for ca in correct)
 

В качестве альтернативы, если вам необходимо использовать в compare_answer функции две строки, вы можете изменить способ ее вызова:

 if any(ca["correct"] and compare_answer(ca["answer"], user_answer) for ca in correct_answer):
    score  = 1
    print(f"Right!")
 

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

1. Я не заставляю это работать. Первый код, который вы связали, ca нигде не используется, и я не знаю, что с ним делать. правильно: список тоже не используется, и я не знаю, что с ним делать. Лучший результат, который я получил, заключается в том, что я могу написать как 2, так и распечатать как ответ и его правильный, но он выводит весь список следующим образом: {«ответ»: «2», «правильно»: Верно} {«ответ»: «печать», «правильно»: Верно}. Есть ли более простой способ сделать это? Таким образом, пользователь может как написать 2, так и распечатать и получить правильное?

2. Я думаю, что вам не хватает а for ca in correct в первом коде

3. @Tomerikoo это исправило одну вещь. Но теперь я получаю: Трассировка (последний последний вызов): Файл «C:UserskevinPycharmProjectsquizpython_quiz.py», строка 16, в <модуле>, если compare_answer(правильный ответ, ответ пользователя): Файл «C:UserskevinPycharmProjectsquizpython_quiz.py», строка 8, в compare_answer возвращает любой(ca[«правильный»] и ca[«ответ»].разделите().ниже() == ответ) Ошибка типа: объект ‘bool’ не может быть повторен

4. @KevinR Вот что я хотел сказать, это не укладывается в рамки. Должно быть: return any(ca["correct"] and ca["answer"].strip().lower() == answer for ca in correct)

5. @Tomerikoo о, это все объясняет. Я откладывал это в долгий ящик, а не в очередь. Спасибо, теперь эта работа. Единственная оставшаяся проблема заключается в том, что весь список ответов печатается, когда пользователь принимает неправильный ответ. «Неверно, правильный ответ: [{«ответ»: «2», «правильно»: Верно}, {«ответ»: «печать», «правильно»: Верно}]» печатается. Нужно ли мне изменить имя ключа или создать новую функцию, чтобы она работала?