2014-09-15 4 views
0

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

Question2 = random.choice(mylist) 
print (Question2) 
Userinput = input() 
if(Question2.position == Question2answer.position): 
    print('Yes, that is correct!') 
else: 
    print('Sorry, wrong answer') 
mylist.remove(Question2) 

я пытаюсь проверить, что пользователь поставил на вопрос 2 был ответ на вопрос 2, а не 4, проверяя позиции в списке.

+0

'enumerate' похоже, что вы хотите –

+0

Вы пробовали поместить эти данные в словарь? Похоже, это было бы более подходящим для ваших целей. – asdf

+0

Что такое Question2answer? –

ответ

1

Простым решением является использование правильного типа данных для задания.

Например, если ваш mylist был списком (question, answer) пар, вместо двух отдельных списков;

Question2, Answer2 = random.choice(mylist) 
print(Question2) 
Userinput = input() 
if Userinput == Answer2: 
    print('Yes, that is correct!') 
else: 
    print('Sorry, wrong answer') 
mylist.remove((Question2, Answer2)) 

Или, наоборот, со словарем вместо списка:

Question2 = random.choice(mydict) 
print(Question2) 
Userinput = input() 
if Userinput == mydict[Question2]: 
    print('Yes, that is correct!') 
else: 
    print('Sorry, wrong answer') 
del mylist[Question2] 

Почему это ДИКТ лучше? Ну, во-первых, со списком вам нужно многократно искать список, чтобы найти нужное значение - например, mylist.remove начинается с начала и сравнивает каждый элемент с вашим значением, пока не найдет правильный. Помимо медленного и чрезмерно сложного, это делает неправильную вещь, если вы можете когда-либо иметь повторяющиеся значения (например, попробуйте a = [1, 2, 3, 1], затем value = a[0], затем a.remove(value) и посмотрите, что произойдет ...).


Но если вы не можете изменить структуру данных, вы всегда можете использовать zip застегивать пару отдельных списков в один список пар на лету:

Question2, Answer2 = random.choice(zip(mylist, myanswers)) 
print(Question2) 
Userinput = input() 
if Userinput == Answer2: 
    print('Yes, that is correct!') 
else: 
    print('Sorry, wrong answer') 
mylist.remove(Question2) 
myanswers.remove(Answer2) 
+0

Я пропустил необходимость удалить заданный вопрос. dict на самом деле лучше для этого требования, как отметил @abarnert. +1 – sberry

+0

@sberry: Вы все еще можете удалить заданный вопрос, используя 'enumerate' поверх' zip', как это делает один из других ответов. – abarnert

+0

О, конечно, я это знаю. Я просто предпочитаю словарь в этом случае. – sberry

0

Вы могли бы используйте namedtuple как контейнер данных.

from collections import namedtuple 
import random 


Question = namedtuple('Question', ['question', 'answer']) 
questions = [ 
    Question('Question 1', 'Answer 1'), 
    Question('Question 2', 'Secret'), 
    Question('Question 3', '3'), 
] 


q = random.choice(questions) 
print("%s ?" % q.question) 
user_input = raw_input().strip() 


if(q.answer == user_input): 
    print('Yes, that is correct!') 
else: 
    print('Sorry, wrong answer') 

questions.remove(q) 
Смежные вопросы