繁体   English   中英

如何在python中从单独的文本文件中打印不匹配的单词

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM