Python文档比较 - 返回所有单词不在其他文档中

时间:2015-03-17 04:40:32

标签: python for-loop string-comparison

我正在尝试创建一个“翻译比较”程序,该程序读取并比较两个文档,然后在一个文档中返回 ALL 单词,这些单词不在另一个文档中。现在,我的程序只返回'file1'中不在'file2'中的单词的第一个实例。这是一个初学者类,所以我试图避免使用模糊的内部方法,即使这意味着效率较低的代码。这就是我到目前为止......

def translation_comparison():
   import re
   file1 = open("Desktop/file1.txt","r")
   file2 = open("Desktop/file2.txt","r")
   text1 = file1.read()
   text2 = file2.read()
   text1 = re.findall(r'\w+',text1)
   text2 = re.findall(r'\w+',text2)
   for item in text2:
       if item not in text1:
           return item  

3 个答案:

答案 0 :(得分:3)

虽然Jason Brooks的答案是完美的,但我想你也可以看看这个。这利用了set()的基本功能,并且不需要循环。

def translation_comparison():
    import re
    file1 = open("text1.txt","r")
    file2 = open("text2.txt","r")
    text1 = file1.read()
    text2 = file2.read()
    text1 = set(re.findall(r'\w+',text1))
    text2 = set(re.findall(r'\w+',text2))
    return list(text1.difference(text2))

set().difference()是一种基本方法。所以我想,这可能不被认为是一种晦涩的内部方法"。

答案 1 :(得分:1)

您可以这样做:

def translation_comparison():
   import re
   file1 = open("text1.txt","r")
   file2 = open("text2.txt","r")
   text1 = file1.read()
   text2 = file2.read()
   text1 = re.findall(r'\w+',text1)
   text2 = re.findall(r'\w+',text2)
   # added lines below
   text1 = list(set(text1))
   text2 = list(set(text2))
   for word in text2:
    if word in text1:
        text1.remove(word)
   return text1

从我的评论开始。我们首先将该集合用于每个文档中的单词列表。这给我们留下了一个只有独特单词的列表,以防万一有重复。接下来,我们遍历第二个文本中的每个单词,如果该单词也存在于第一个文本中,我们将其从第一个文本中的单词列表中删除。最后,我们只留下text1中不在text2的单词。我们在最后返回该列表,其中包含所有这些词。

如果这有意义,或者您有任何问题,请告诉我。

编辑:根据@blckknght的建议,更简单的方法是简单地使用set subtraction,如下所示:

def translation_comparison():
   import re
   file1 = open("text1.txt","r")
   file2 = open("text2.txt","r")
   text1 = file1.read()
   text2 = file2.read()
   text1 = re.findall(r'\w+',text1)
   text2 = re.findall(r'\w+',text2)
   return list(set(text1) - set(text2))

另请注意,这会将相同的单词大写不同(例如:The vs the)作为单独的单词。虽然使用基本列表理解很容易解决这个问题:text1 = [x.lower() for x in text1]text2 = [x.lower() for x in text2]

答案 2 :(得分:1)

照顾大写的单词。示例“Foo”和“foo”将被视为两个不同的单词,而实际上它们是相同的。代码将此视为不匹配,并将返回