[英]How to print non matching words from seperate text files in python
对于我的项目,我想学习如何从两个单独的文本文件中打印不匹配的单词,以及将不匹配的术语打印到单独的第三个文本文件中。 目前,我有两个类似的文本文件。
----------文件1 ------
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来说是非常新的知识,因此将非常感谢任何有关代码的说明性细节。 希望我明白。 谢谢。
您的程序应如下所示:
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
仅在此块内可用。 在这里查看最后一段
answerLine.strip()
将删除行尾和其他空格。 我们需要这样做,因为在questionLine
,正确的答案永远不会跟在行尾,而在answerLine
,肯定会。 str.strip
zip(list1, list2)
将为您提供成对的行,以便将list1
的第一行与list2
的第一行匹配,依此类推。 在实现中,您实际上是将list1
的所有行与list2
所有行进行匹配。 压缩
if answerLine not in questionLine
将检查wheter answerLine
不会发生questionLine
。 如果使用answerLine == questionLine
,则将检查字符串是否相同。 请参阅此处的注释
最后略加评论。 如果您在第三个文件中输入的所有内容都是错误的答案,则无法将其与它们来自的实际问题相匹配。
因此,我建议像这样再次改善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可以像这样解析嵌套的元组。 枚举
带有改进的for循环的“ Feedback.txt”和您的示例作为输入:
The incorrect answers are:
Q1: A*
Q3: C*
Q5: E*
Q6: A*
Q7: D*
Q8: E*
Q10: E*
如果您有两个长度相同的列表,则可以枚举一个列表并将其与另一个列表进行比较。 有了map和enumerate,它是一个单行。 之后,您将获得一个包含所有结果的列表:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.