user3029955
user3029955

Reputation: 29

Comparing 2 lists and appending the differences into a 3rd

I have an issue and I can't for the life of me get anything to return past ()

exam_solution = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C',\
           'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']

student_answers = ['B', 'D', 'B', 'A', 'C', 'A', 'A', 'A', 'C', 'D', 'B', 'C',\
           'D', 'B', 'D', 'C', 'C', 'B', 'D', 'A']

I need to compare the 2 lists and append the differences into questions_missed = [] I haven't found anything remotely close to working. Any help would be appreciated

edit: In python been stroking out over it all day.

Upvotes: 0

Views: 120

Answers (7)

SmartElectron
SmartElectron

Reputation: 1441

Solution (use set):

>>> def result(solution, answers):
...     return set(str(n)+s for n, s in enumerate(solution)) - \ 
...            set(str(n)+r for n, r in enumerate(answers))
...
>>> result(exam_solution, student_answers)
... set(['6B', '13A', '2A'])
>>>

The result are wrong responses (you can convert to list list(result(student_answers)).

Upvotes: 0

BlackMamba
BlackMamba

Reputation: 10254

L = [(a, b) for a, b in zip(exam_solution, student_answers) if a != b]
print(L)

Mybe you can use zip function.

The output is: [('A', 'B'), ('B', 'A'), ('A', 'B')]

Upvotes: 0

Using the KISS design principle, that's how I'd do it:

exam_solution = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C',\
       'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']

student_answers = ['B', 'D', 'B', 'A', 'C', 'A', 'A', 'A', 'C', 'D', 'B', 'C',\
       'D', 'B', 'D', 'C', 'C', 'B', 'D', 'A']

questions_missed = []

for index in range(len(exam_solution)):
    # this assumes exam_solution and student_answers have the same size!
    if exam_solution[index] != student_answers[index]:
        questions_missed.append(index)

print (questions_missed)

And the output is:

[2, 6, 13]

Upvotes: 0

Guy Gavriely
Guy Gavriely

Reputation: 11396

use python list comprehensions to check list diff:

print [(index, i, j) for index, (i, j) in enumerate(zip(exam_solution, student_answers)) if i != j]
[(2, 'A', 'B'), (6, 'B', 'A'), (13, 'A', 'B')]

Upvotes: 1

Elliott Frisch
Elliott Frisch

Reputation: 201429

Assuming you want an output in common English like this -

Question 3 A != B
Question 7 B != A
Question 14 A != B

You could try -

from array import *

exam_solution = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C',\
       'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
student_answers = ['B', 'D', 'B', 'A', 'C', 'A', 'A', 'A', 'C', 'D', 'B', 'C',\
       'D', 'B', 'D', 'C', 'C', 'B', 'D', 'A']
questions_missed = []
count = 0
for answer in exam_solution:
    if (answer != student_answers[count]):
            questions_missed.append(count)
    count = count + 1

for question in questions_missed:
    print str.format("Question {0} {1} != {2}", question+1,
            exam_solution[question], student_answers[question]);

Upvotes: 0

Mark Simpson
Mark Simpson

Reputation: 2374

Using list comprehensions:

[x for i, x in enumerate(exam_solution) if exam_solution[i] != student_answers[i] ]

['A', 'B', 'A']

Upvotes: 0

joshreesjones
joshreesjones

Reputation: 1954

You can modify this solution to fit your needs:

exam_solution = ['B', 'D', 'A', 'A', 'C', 'A', 'B', 'A', 'C', 'D', 'B', 'C', 'D', 'A', 'D', 'C', 'C', 'B', 'D', 'A']
student_answers = ['B', 'D', 'B', 'A', 'C', 'A', 'A', 'A', 'C', 'D', 'B', 'C', 'D', 'B', 'D', 'C', 'C', 'B', 'D', 'A']

results = []

correct = 0
incorrect = 0

index = 0
while index < len(student_answers):
    if student_answers[index] == exam_solution[index]:
        results.append(True)
        correct += 1
    else:
        results.append(False)
        incorrect += 1

    index += 1

print("You answered " + correct + " questions correctly and " + incorrect + " questions incorrectly.")

Upvotes: 0

Related Questions