我想创建一个功能,接收学生的测试答案和答案键,然后返回一个列表,说明他们是否使用1和0来判断对错是对还是错。 这是我的代码
answerkey='ABCABCDDD'
student11='BBCCBCDDD'
def check_answers(X='student',Y='answer key'):
result=[]
for i in range(len(X)):
for o in range(len(Y)):
if i==o:
result.append('1')
else:
result.append('0')
return result
print(check_answers(student11,answerkey))
我的输出应该给我:
['0','1','1','0','1','1','1','1','1']
而它给了我这个:
['1', '0', '0', '0', '0', '0', '0', '0', '0']
我做错了什么?
答案 0 :(得分:3)
使用理解和zip:
可以简化这一切>>> ['1' if x == y else '0' for x, y in zip(answerkey, student11)]
['0', '1', '1', '0', '1', '1', '1', '1', '1']
但是,为了解决您的问题,您实际上正在使用该内部循环执行不必要的额外步骤。这是你不需要的额外低效率。依靠你的两个列表是相等的事实,所以迭代一个,然后只与另一个列表进行比较。使用enumerate
,以便在每次迭代中您都可以访问索引和值。
此外,您没有正确使用默认关键字参数。默认情况下,您将它们指定为字符串,而不是对这种赋值的默认情况执行任何操作,因此请将其删除。
观察:
answerkey='ABCABCDDD'
student11='BBCCBCDDD'
def check_answers(X, Y):
result=[]
for i, v in enumerate(answerkey):
if v == student11[i]:
result.append('1')
else:
result.append('0')
return result
print(check_answers(student11,answerkey))
输出:
['0', '1', '1', '0', '1', '1', '1', '1', '1']
答案 1 :(得分:1)
这种情况正在发生,因为o
和i
正在计算一个范围,即他们正在计算0,1,2...len(X)
,而你也在为每个X值迭代Y的每个值而不是你应比较同一索引列表中的变量
answerkey='ABCABCDDD'
student11='BBCCBCDDD'
def check_answers(X,Y):
result=[]
for i in range(len(X)):
if X[i] == Y[i]:
result.append('1')
else:
result.append('0')
return result
print(check_answers(student11,answerkey))
在该算法中,它迭代X的长度,并将列表的每个vallue与相同的索引进行比较,例如:它会检查X[0] = Y[0]
同样在您的功能中,您可以使X ='学生'和Y ='回答键'这很好,因为你只有两个参数并且它会覆盖它们但是如果你以后添加更多这可能会导致问题,如果你的目的只是将这些作为注释我建议只在它下面添加一个#X = student and Y = answer key
是清洁器
答案 2 :(得分:0)
如果你想弄清楚你做错了什么,我会策略性地输入2个打印语句,告诉你代码的问题。
def check_answers(X='student',Y='answer key'):
result=[]
print('X: %d, Y: %d' % (len(X), len(Y)))
for i in range(len(X)):
for o in range(len(Y)):
print('i: %d, o: %d' % (i, o))
if i==o:
result.append('1')
else:
result.append('0')
return result
答案 3 :(得分:0)
除了其他答案,我建议您使用地图功能
answerkey='ABCABCDDD'
student11='BBCCBCDDD'
def check_answers(X='student',Y='answer key'):
return map(lambda a,b:a==b and '1' or '0',X,Y)
print(check_answers(answerkey,student11))