我是编程初学者。我正在尝试比较两个列表,并将差异保存在第三个列表中。
如何将不正确的值复制到第三个列表中?
我相信有更有效的编码方法,但我需要使用我在这里所拥有的(除非它无法修复(。
mc_answers是[A,C,A,A,D]我试图将其与用户输入的内容进行比较,因此,如果input_list是[A,A,A,A.,],w_answers将是[C,D](函数user_input被分配给input_list以使其更容易使用(。
def wrong_input(input_list, mc_answers):
print()
wrong_answers=[]
for i in range (5):
while input_list[i]!=mc_answers[i]:
wrong_answers.append(input_list[i])
return wrong_answers
和:
def main():
mc_answers=['A', 'C', 'A', 'A', 'D']
display_test()
input_list=user_input()
print(wrong_input(input_list, mc_answers))
def user_input():
user_answers=[]
print()
for i in range (5):
user_answers.append(input('nAnswer'+str(i+1)+ ': '))
return user_answers
def wrong_input(input_list, mc_answers):
print()
w_answers=[]
for i in range (5):
while input_list[i]!=mc_answers[i]:
w_answers.append(input_list[i])
return w_answers
main()
不要试图用自己的算法来确定两个列表之间的差异。您可以使用set
来确定两个列表之间的差异。集合是Python中的内置数据类型,使用set()
函数(类似于list()
函数(或使用{}
进行调用。
您可以使用symmetric_difference
方法来确定两个列表之间的差异,也可以使用difference
方法来确定一个列表中不在另一个列表的差异。考虑一下,
list1 = [3, 12, 7, 8]
list2 = [1, 5, 12, 3]
list3 = set(list1).symmetric_difference(list2)
print(list(list3))
该输出:
[1, 5, 7, 8]
这意味着数字1、5、7和8在list1
和list2
之间并不常见。根据您的需求,您可以使用difference
方法:
list1 = [3, 12, 7, 8]
list2 = [1, 5, 12, 3]
list3 = set(list1).difference(list2)
print(list(list3))
该输出:
[7, 8]
这意味着7和8在list1
中,但不在list2
中。然而,您需要记住集合的一些后果。例如,如果将列表转换为集合,它将删除重复项。请参阅:
list1 = [1, 1, 2, 3]
print(set(list1))
哪个输出:
{1, 2, 3}
有关集合的更好解释,请参见此。
编辑
如果你只想要一个函数来完成你给我们的例子,那么集合可能不是你的选择,因为你要处理的是有重复的列表。您可以使用len
函数来计算range
函数中包含的内容。
def wrong_input(input_list, correct_answers):
wrong_answers = []
for i in range(len(correct_answers)):
for j in range(len(input_list)):
# Move to the next item in correct_answers if this is true:
if input_list[j] == correct_answers[i]:
break
# If we hit this condition, then that means that we looped through all of input_list and there were no
# items that were the equal an individual item in correct_answers
if j == len(input_list) - 1:
wrong_answers.append(correct_answers[i])
return wrong_answers
mc_answers = ['A', 'C', 'A', 'A', 'D']
user_answers = ['A', 'A', 'A', 'A', 'A']
print(wrong_input(user_answers, mc_answers))
该输出:
['C', 'D']
首先,感谢所有提供帮助的人。对于任何试图找到一种更简单(尽管效率不高(的方法的人来说:
def wrong_input(input_list, mc_answers): # The two parameters are lists from main() and user_input()
wrong_answers=[]
for i in range(5):
if input_list[i]!=mc_answers[i]:
wrong_answers.append(input_list[i])
return wrong_answers
在@Barmar指出while
循环在这种情况下永远不会结束后,我将while
更改为if
语句。
需要记住的无关点(以防有人遇到它们,就像我一样(:
- 如果范围大于正在比较的列表(即,此代码中的
range(6)
而不是range(5)
(,则会导致错误list index out of range
(此代码中两个列表的长度都为5。( - 我的代码的第一个版本导致了错误
function 'object' not subscriptable
@Barmar指出,我在引用函数user_input input_list=user_input
而不是input_list=user_input()
时省略了括号,这导致了这个错误