Python列表比较问题

use*_*918 1 python

我需要用Python编写一个程序,比较两个并行列表,对多项选择考试进行评分.一个列表有考试解决方案,第二个列表有学生的答案.每个遗漏问题的问题编号将使用自然索引编号存储在第三个列表中.解决方案必须使用索引.

我一直在为第三个列表返回一个空列表.所有帮助非常感谢!

def main():
    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 item in exam_solution:
        if item not in student_answers:
            questions_missed.append(item)
Run Code Online (Sandbox Code Playgroud)

Tho*_*anz 5

questions_missed = [i for i, (ex,st) in enumerate(zip(exam_solution, student_answers)) if ex != st]
Run Code Online (Sandbox Code Playgroud)

或者,如果您更喜欢循环而不是列表推导:

questions_missed = []
for i, (ex,st) in enumerate(zip(exam_solution, student_answers)):
    if ex != st:
        questions_missed.append(i)
Run Code Online (Sandbox Code Playgroud)

两者都给 [2,6,13]

说明:

enumerate 是一个实用函数,它返回一个可迭代的对象,它产生索引和值的元组,松散地说,它可以用来"在迭代期间使当前索引可用".

Zip创建一个元组列表,包含来自两个或多个可迭代对象的对应元素(在您的案例列表中).

我更喜欢列表理解版本.

如果我添加一些时序代码,我发现性能在这里并没有真正区别:

def list_comprehension_version():
    questions_missed = [i for i, (ex,st) in enumerate(zip(exam_solution, student_answers)) if ex != st]
    return questions_missed

def loop_version():
    questions_missed = []

    for i, (ex,st) in enumerate(zip(exam_solution, student_answers)):
        if ex != st:
            questions_missed.append(i)

    return questions_missed

import timeit

print "list comprehension:", timeit.timeit("list_comprehension_version", "from __main__ import exam_solution, student_answers, list_comprehension_version", number=10000000)
print "loop:", timeit.timeit("loop_version", "from __main__ import exam_solution, student_answers, loop_version", number=10000000)
Run Code Online (Sandbox Code Playgroud)

得到:

list comprehension: 0.895029446804
loop: 0.877159359719
Run Code Online (Sandbox Code Playgroud)