如何比较两个列表并将差异复制到第三个列表中(python)



我是编程初学者。我正在尝试比较两个列表,并将差异保存在第三个列表中。

如何将不正确的值复制到第三个列表中?

我相信有更有效的编码方法,但我需要使用我在这里所拥有的(除非它无法修复(。

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在list1list2之间并不常见。根据您的需求,您可以使用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()时省略了括号,这导致了这个错误

最新更新