我需要用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)
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)
| 归档时间: |
|
| 查看次数: |
71 次 |
| 最近记录: |