2015-10-28 2 views
-3

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

correct_answers = ['A', 'C', 'A', 'B', 'D'] 
user_answers = ['B', 'A', 'C', 'B', 'D'] 

Мне нужно сравнить два из них (без использования наборов, если это вообще возможно) и отслеживать, сколько ответов на человеке не правы - в этом случае, 3

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

correct = 0 

for i in correct_answers: 
    for j in user_answers: 
     if i == j: 
      correct += 1 

print(correct) 

, но это не работает, и я не уверен, что мне нужно изменить, чтобы он работал.

+0

Вы используете 'если в'. Это проверит, находится ли он где-нибудь в списке. Вам нужно использовать индекс элемента. –

ответ

0

Менее pythonic, более общее (и читаемое) решение довольно просто.

correct_answers = ['A', 'C', 'A', 'B', 'D'] 
user_answers = ['B', 'A', 'C', 'B', 'D'] 

incorrect = 0 
for i in range(len(correct_answers)): 
    if correct_answers[i] != user_answers[i]: 
     incorrect += 1 

Это предполагает, что ваши списки имеют одинаковую длину. Если вам нужно проверить это, вы можете сделать это перед запуском этого кода.

EDIT: Следующий код делает то же самое, если вы знакомы с zip

correct_answers = ['A', 'C', 'A', 'B', 'D'] 
user_answers = ['B', 'A', 'C', 'B', 'D'] 

incorrect = 0 
for answer_tuple in zip(correct_answers, user_answers): 
    if answer_tuple[0] != answer_tuple[1]: 
     incorrect += 1 
+0

Мораль: иногда вам нужно просто вернуться к основам. – ycsun

+0

У меня нет возражений против явного цикла, но для любви к Богу используйте 'zip', а не циклы C-стиля с индексированием и используйте'! = ', А не' not x == y'. Первый - это программа-программист recidivist C (что делает код менее удобочитаемым и менее надежным, так как 'zip' с распаковкой дает полезные имена и позволяет избежать ошибок за пределами). Последнее просто уродливо. – ShadowRanger

2

Просто посчитайте их:

correct_answers = ['A', 'C', 'A', 'B', 'D'] 
user_answers = ['B', 'A', 'C', 'B', 'D'] 

incorrect = sum(1 if correct != user else 0 
       for correct, user in zip(correct_answers, user_answers)) 
+1

Возможно, вы упростите его как 'sum (answer1! = Answer2 для answer1, answer2 в zip (correct_answers, user_answers))'. – alecxe

+0

Хотя это сработает, оно будет полагаться на то, что 'True == 1', что не очень чисто. – spectras

+1

Или если вы хотите использовать батареи еще больше (что подталкивает всю работу к слою C в CPython): 'from operator import ne',' sum (map (ne, correct_answers, user_answers)) ' – ShadowRanger

2

виню @alecxe для убедила меня этот пост, ультра-эффективное решение:

from future_builtins import map # <-- Only on Python 2 to get generator based map and avoid intermediate lists; on Py3, map is already a generator 
from operator import ne 

numincorrect = sum(map(ne, correct_answers, user_answers)) 

Заносит всю работу к слою C (что делает его сумасшедший быстро, по модулю начальная стоимость установки всего этого, не выполняется байт-код, если обрабатываемые значения являются встроенными типами Python, что устраняет много накладных расходов), а однострочное - без слишком загадочного.

Смежные вопросы