2015-01-14 5 views
0

Программа читает набор ответов от python. l_answers были бы правильными. l_rscore - это ответы, прочитанные из файла и теперь индексированные в список.Программа, которая сравнивает два списка python

Мне нужно знать, как я буду продолжать, если я хочу сравнить друг друга (список [0] || list2 [0]) и проверить количество правильных ответов и неправильных.

Текущий подход не работает и не дает следов. Он просто «вычисляет», никогда не заканчивая.

def main(): 

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

    l_rscore = read_file()  
    result = get_result(l_answers, l_rscore) 
    print result 

def read_file(): 
    rows = 4 
    colums = 5 
    l_results = [] 

    input_file = open('answers.txt', 'r') 

    for r in range(rows): 
     for c in range(colums): 
      for line in input_file: 
       l_results.append(line.strip()) 

    return l_results 

def get_result(l, l_2): 

    correct = 0 
    index = 0 
    while index < len(l): 
     if l_2[index] == l[index]: 
      correct += 1 
      index += 1 
    return correct 

main() 
+2

Я не думаю, что вы можете перебрать 'input_file' больше, чем когда-то в этом роде. – Kevin

+0

Не уверен, что вы имеете в виду. – PlateArmor

+0

Как только вы перебираете файловый объект, он становится исчерпан; итерация по ней снова даст вам нулевые строки. Поэтому наличие 'для строки в input_file:' внутри другого цикла не будет работать правильно, потому что оно даст вам только значения в первый раз. – Kevin

ответ

1

Ваш бесконечный цикл прямо здесь:

index = 0 
while index < len(l): 
    if l_2[index] == l[index]: 
     correct += 1 
     index += 1 

Если первые ответы не равны друг другу, индекс никогда не будет увеличиваться, и цикл пока держится итерации, застрял на первые ответы ,

+0

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

2

У вас есть бесконечный цикл в get_result, где у вас есть условие перед увеличением index, который не всегда выполняется.

Вообще, если у вас есть два списка, один из которых ответы и другие предложения (с тем же порядком) - вы можете использовать zip обрабатывать их вместе:

def compare_answers(suggestions, answers): 
    # pair what was answered with what's true 
    pairs = zip(suggestions, answers) 
    # summarize scores - 1 for each correct answer 
    return sum(i == j for i, j in pairs) 

Примечание: При добавлении True к номеру, оно обрабатывается как 1 (False равно 0). Таким образом, sum дает нам номер (сумма по умолчанию начинается с 0).

+1

нет необходимости в карте/lambda: 'sum (i == j для i, j в zip (l, l2))' достаточно – fredtantini

+0

@fredtantini не думал об этом, спасибо! :) Вот почему 'True' технически' 1' ** при добавлении его в 0 ** (редактировать), правильно? –

2

Вы можете сгладить оба ваших списка и сравнить их с помощью списка.

def get_results(l, l2): 

    lflat = [i for sublist in l for i in sublist] 
    l2flat = [i for sublist in l2 for i in sublist] 

    return sum(i[0] == i[1] for i in zip(lflat, l2flat)) 
0

Прежде всего, вам нужно прочитать файл, как так input_file = open('answers.txt', 'r').read(), а затем вы должны разобрать это в вложенный список. Во-вторых, ваш цикл в нижней части должна быть:

while index < len(l): 
    if l_2[index] == l[index]: 
     correct += 1 
    index += 1 

EDIT: Если ваш файл записывается в виде списка списков, вы можете создать список легко, как это так, оценивая содержащуюся строку в виде списка.

input_file = eval(open('answers.txt', 'r').read())

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