Сравните список входных данных пользователей с установленным списком с дубликатами

Я пытаюсь взять набор ответов либо «A» «B» «C», либо «D» в определенном порядке, например, в тесте множественного выбора, и пользователь вводит свои ответы. После того, как я хотел бы создать третий список и распечатать, что было правильно и что неправильно. Вот что я до сих пор.

userAnswersList = [] correctAnswers = ['A', 'C', 'A', 'A', 'D', 'B', 'C', 'A', 'C', 'B', 'A', 'D', 'C', 'A', 'D', 'C', 'B', 'B', 'D', 'A'] while len(userAnswersList) <= 19: userAnswers = input('Give me each answer total of 20 questions I\'ll let you know how many you missed.') userAnswersList.append(userAnswers.upper()) correctedList = [] for i in userAnswersList: if i in correctAnswers: correctedList.append(i) else: correctedList.append('XX') print(correctedList) 

Таким образом, мой конечный результат будет скорректированным списком с «Х» на месте, где они пропустили ответ. Если он прав, он просто вводит пользователя в это место. Поэтому после того, как пользователь выполнит свои 20 ответов, он будет выглядеть как «A», «C», «A», «XX», «D», «B», «C», «XX», «C», B ',' A ',' XX ',' C ',' A ',' D ',' XX ',' B ',' B ',' XX ',' A '], если они пропустили 5 вопросов в этом заказ

РЕДАКТИРОВАТЬ

Еще раз спасибо за вашу помощь. Я смог решить свои проблемы с вашей помощью и дать отличные ответы. Я использовал решение Nicks, так как мы его изучаем.

Я попробую других, чтобы я мог привыкнуть к ним.

Вместо использования:

 for i in userAnswersList: 

вам может быть проще прокручивать массив и проверить, равны ли значения, например:

 for i in range(len(userAnswersList)): if userAnswersList[i] == correctAnswers[i]: correctedList.append(userAnswersList[i]) else: correctedList.append('XX') 

Здесь нет никаких вопросов, поэтому я предполагаю, что вы спрашиваете, что случилось с тем, что у вас есть.

В разделе сравнения используется одна и та же переменная i в обоих списках, но даже если она была другой, она не сработает.

Вам нужно что-то в следующих строках:

 for i in range(len(correctAnswers)): correctedList.append(correctAnswers[i] if userAnswersList[i] == correctAnswers[i] else 'XX') 

Это можно сделать с помощью метода карты Python.

Как поясняется в справке для карты:

 map(...) map(function, sequence[, sequence, ...]) -> list Return a list of the results of applying the function to the items of the argument sequence(s). If more than one sequence is given, the function is called with an argument list consisting of the corresponding item of each sequence, substituting None for missing values when not all sequences have the same length. If the function is None, return a list of the items of the sequence (or a list of tuples if more than one sequence). 

Таким образом, в этом случае вы хотите сравнить каждый элемент ваших двух равных списков и применить к ним условие. Условие, которое мы представим, будет следовать этой логике:

если что-то в одном списке не равно другому, установите «XX», в противном случае верните значение.

Итак, мы представим так называемую функцию «лямбда», чтобы поставить это выше условие. Вот документация о том, что такое лямбда: http://www.python-course.eu/lambda.php

 lambda x, y: 'XX' if x != y else y 

Итак, когда мы собрали все это вместе, мы имеем следующее:

 d = map(lambda x, y: 'XX' if x != y else y, userAnswersList, correctAnswers) 

Демо-версия:

 correctAnswers = ['A', 'C', 'A', 'A', 'D', 'B', 'C', 'A', 'C', 'B', 'A', 'D', 'C', 'A', 'D', 'C', 'B', 'B', 'D', 'A'] 

 userAnswersList = ['A', 'C', 'A', 'B', 'D', 'B', 'C', 'A', 'A', 'B', 'A', 'C', 'C', 'A', 'D', 'C', 'D', 'C', 'D', 'B'] 

Результат:

 ['A', 'C', 'A', 'XX', 'D', 'B', 'C', 'A', 'XX', 'B', 'A', 'XX', 'C', 'A', 'D', 'C', 'XX', 'XX', 'D', 'XX'] 

Вы можете объединить два списка вместе и проверить элементы в общих индексах, вы можете получить все ответы, используя понимание списка, заменяющее ваше время диапазоном :

 userAnswersList = [input('Give me each answer total of 20 questions I\'ll let you know how many you missed.').upper() for _ in range(20)] correctAnswers = ['A', 'C', 'A', 'A', 'D', 'B', 'C', 'A', 'C', 'B', 'A', 'D', 'C', 'A', 'D', 'C', 'B', 'B', 'D', 'A'] correctedList = ["XX" if u_a != c_a else u_a for u_a, c_a in zip(userAnswersList)] 

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