#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», «правильно»: Верно}, {«ответ»: «печать», «правильно»: Верно}]» печатается. Нужно ли мне изменить имя ключа или создать новую функцию, чтобы она работала?