将用户输入列表与设置列表按顺序进行比较

时间:2015-10-18 20:07:59

标签: python list duplicates compare

我试图以特定顺序(例如多项选择测试)采取一组答案“A”,“B”,“C”或“D”,并让用户输入他的答案。在我希望它创建第三个列表并打印出正确和错误之后。这是我到目前为止所拥有的。

 userAnswersList = []
 correctAnswers = ['A', 'C', 'A', 'A', 'D', 'B', 'C', 'A', 'C', 'B', 'A', 'D', 'C', 'A', 'D', 'C', 'B', 'B', 'D', 'A']

 while len(userAnswersList) <= 19:
     userAnswers = input('Give me each answer total of 20 questions I\'ll let  you know how many you missed.')
     userAnswersList.append(userAnswers.upper())

correctedList = []
for i in userAnswersList:
    if i in correctAnswers:
        correctedList.append(i)
    else:
        correctedList.append('XX')

print(correctedList)

所以我的最终结果将是更正的列表,其中有一个'X',他们错过了答案,如果它是正确的,它只是将用户输入放在那个地方。 因此,在用户输入他们的20个答案后,它看起来就像 ['A','C','A','XX','D','B','C','XX','C','B','A','XX',' C','A','D','XX','B','B','XX','A'] 如果他们按顺序错过了5个问题

修改

再次感谢您的帮助,我能够通过您的帮助和一些很好的答案来解决我的问题。我使用Nicks解决方案,因为我们正在学习它。

我会尝试其他人,这样我就可以适应他们了。

4 个答案:

答案 0 :(得分:1)

这里没有问题,所以我假设你问的是你有什么问题。

比较部分在两个列表中使用相同的变量i,但即使它不同也不起作用。

您需要以下内容:

for i in range(len(correctAnswers)):
    correctedList.append(correctAnswers[i] if userAnswersList[i] == correctAnswers[i] else 'XX')

答案 1 :(得分:0)

而不是使用:

for i in userAnswersList:

您可能会发现迭代数组并检查值是否相等更容易,例如:

for i in range(len(userAnswersList)):
    if userAnswersList[i] == correctAnswers[i]:
        correctedList.append(userAnswersList[i])
    else:
        correctedList.append('XX')

答案 2 :(得分:0)

这可以使用Python的map方法完成。

如地图帮助中所述:

map(...)
    map(function, sequence[, sequence, ...]) -> list

    Return a list of the results of applying the function to the items of
    the argument sequence(s).  If more than one sequence is given, the
    function is called with an argument list consisting of the corresponding
    item of each sequence, substituting None for missing values when not all
    sequences have the same length.  If the function is None, return a list of
    the items of the sequence (or a list of tuples if more than one sequence).

因此,在这种情况下,您希望比较两个相等列表中的每个项目,并对它们应用条件。我们将介绍的条件将遵循以下逻辑:

如果一个列表中的某些内容与另一个列表中的内容不相等,则设置为“XX”,否则返回该值。

所以,我们将在这里介绍所谓的“lambda”函数以将其置于上述条件之下。以下是关于lambda是什么的文档:http://www.python-course.eu/lambda.php

lambda x, y: 'XX' if x != y else y

所以,当我们把它们放在一起时,我们有这个:

d = map(lambda x, y: 'XX' if x != y else y, userAnswersList, correctAnswers)

演示:

correctAnswers = ['A', 'C', 'A', 'A', 'D', 'B', 'C', 'A', 'C', 'B', 'A', 'D', 'C', 'A', 'D', 'C', 'B', 'B', 'D', 'A']
userAnswersList = ['A', 'C', 'A', 'B', 'D', 'B', 'C', 'A', 'A', 'B', 'A', 'C', 'C', 'A', 'D', 'C', 'D', 'C', 'D', 'B']

结果:

['A', 'C', 'A', 'XX', 'D', 'B', 'C', 'A', 'XX', 'B', 'A', 'XX', 'C', 'A', 'D', 'C', 'XX', 'XX', 'D', 'XX']

答案 3 :(得分:0)

您可以zip将两个列表放在一起并检查常用索引中的元素,您可以使用列表理解使用range替换您的所有答案:< / p>

userAnswersList = [input('Give me each answer total of 20 questions I\'ll let  you know how many you missed.').upper() 
                   for _ in range(20)]
correctAnswers = ['A', 'C', 'A', 'A', 'D', 'B', 'C', 'A', 'C', 'B', 'A', 'D', 'C', 'A', 'D', 'C', 'B', 'B', 'D', 'A']

correctedList = ["XX" if u_a != c_a else u_a for u_a, c_a in zip(userAnswersList)]

如果每个列表中的相应元素相同,我们会添加该字母,否则我们会添加"XX"来标记错误答案。