对于我的项目,我想学习如何从两个单独的文本文件中打印不匹配的单词,并将不匹配的术语打印到另一个第三个文本文件中。目前,我有两个单独的文本文件,像这样。
---------- ------ File1中
What is 2+2? A = 1, B* = 4, C = 10, D = 12, E = 14
What is a 7+7? A = 144, B* = 14, C* = 32, D = 95, E = 16
What is 1x1? A* = 1, B = 7, C = 21, D = 420, E = 1762
What is 10/2? A = 4, B = 10, C = 2, D* = 5, E = 210
What is 4^2? A = 10, B = 20, C = 1, D* = 16, E = 980
What is 5+1? A = 4, B = 1, C = 0, D = 2, E* = 6
What is 5x0? A = 8, B = 10, C* = 0, D = 2, E = 20
What is 9+10? A* = 19, B = 7, C = 8, D = 221, E = 21
What is 2+1? A = 2, B* = 3, C = 9, D = 12, E = 32
What is 6+6+6? A = 19, B = 27, C* = 18, D = 12, E = 234
----------文件2 -------
A*
B*
C*
D*
E*
A*
D*
E*
B*
E*
这两个文件都有单独的行打印字符。我想知道如何匹配这两个文件,并在不同的行上打印非匹配的单词。例如,在第1行,单词A *在任一文本文件中都不匹配,因此它将打印到单独的第三个文本文件中。
我的尝试
f1 = open("QuestionsMaths.txt", "r")
f2 = open("AnswersMaths.txt", "r")
f3 = open("Feedback.txt", "a")
list1 = f1.readlines()
list2 = f2.readlines()
f3.write("The incorrect answers are: \n")
for i in list1:
for j in list2:
if i==j:
f3.write(i)
然而,所有这些代码都是打印句子不正确的答案是:
非常新的Python,所以任何有关代码的指导细节都将非常受欢迎。希望我清楚。感谢。
答案 0 :(得分:0)
您的程序应如下所示:
with open("QuestionsMaths.txt", "r") as f1:
list1 = f1.readlines()
with open("AnswersMaths.txt", "r") as f2:
list2 = f2.readlines()
with open("Feedback.txt", "a") as f3:
f3.write("The incorrect answers are: \n")
for questionLine, answerLine in zip(list1, list2):
if answerLine.strip() not in questionLine:
f3.write(answerLine)
解释
with open(filename, ...) as f
是使用文件的正确方法。如果你这样做,当有异常或缩进块完成时它将自动关闭。请注意,f
仅在此块中可用。 See last paragraph here
answerLine.strip()
将删除行尾和其他空格。我们需要这样做,因为在questionLine
中,正确的答案永远不会被行结束,但在answerLine
它肯定会。 str.strip
zip(list1, list2)
会为您提供一对行,以便您将list1
的第一行与list2
的第一行匹配,依此类推。通过实施,您实际上将list1
中的所有行与list2
中的所有行匹配。 zip
if answerLine not in questionLine
会检查answerLine
中未发生questionLine
的情况。如果您使用answerLine == questionLine
,您将检查字符串是否为SAME。 See Note here
最后一点点评论。如果你在第三个文件中输入的所有内容都是错误的答案,那么你就无法将它们与他们来自的实际问题相匹配 因此,我建议再次改进for循环:
for question, (questionLine, answerLine) in enumerate(zip(list1, list2), 1):
if answerLine.strip() not in questionLine:
# answerLine still ends with lineend, so no lineend in
# the format string.
f3.write('Q{}: {}'.format(question, answerLine))
enumerate(iterable, start=0)
将返回一个包含索引的元组以及列表的相应元素(在本例中也是一个元组)。是的,python可以解决这样的嵌套元组。
enumerate
" Feedback.txt"使用改进的for循环和您的示例作为输入:
The incorrect answers are:
Q1: A*
Q3: C*
Q5: E*
Q6: A*
Q7: D*
Q8: E*
Q10: E*
答案 1 :(得分:0)
如果您有两个长度相同的列表,则可以枚举一个列表并将其与另一个列表进行比较。使用map和枚举它是一个oneliner。之后,您将获得包含所有结果的列表:
list3 = map(lambda (i,x): x if x in list1[i] else '', enumerate(list2))
print '\n'.join(list3)
只需将其保存到第三个文件中即可。
我建议首先剥离两个列表中的项目以避免匹配问题:
list1 = map(lambda r: r.strip(), list1)
list2 = map(lambda r: r.strip(), list2)