Python 文档比较 - 返回不在其他文档中的所有单词
Python Document Comparison - returning ALL words NOT IN other document
我正在尝试创建一个 "translation comparison" 程序来读取和比较两个文档,然后 returns ALL 个文档中不存在的单词在另一份文件中。现在,我的程序只有 returns 'file1' 中不在 'file2' 中的单词的第一个实例。这是给初学者 class 的,所以我尽量避免使用晦涩的内部方法,即使这意味着代码效率较低。这是我目前所拥有的...
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
你可以这样做:
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
中的单词。我们 return 最后的列表,其中包含所有这些词。
让我知道这是否有意义,或者如果您有任何问题。
编辑:根据@blckknght 的建议,一种更简单的方法是简单地使用集合减法,如下所示:
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
与 the
)视为不同的词。虽然这很容易通过基本的列表理解来解决:text1 = [x.lower() for x in text1]
和 text2 = [x.lower() for x in text2]
.
注意大写单词。示例 "Foo" 和 "foo" 将被视为两个不同的词,而实际上它们是相同的。该代码会将此视为不匹配,并将 return
虽然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()
是一个基本的方法。所以我猜,这可能不算 "obscure internal method".
我正在尝试创建一个 "translation comparison" 程序来读取和比较两个文档,然后 returns ALL 个文档中不存在的单词在另一份文件中。现在,我的程序只有 returns 'file1' 中不在 'file2' 中的单词的第一个实例。这是给初学者 class 的,所以我尽量避免使用晦涩的内部方法,即使这意味着代码效率较低。这是我目前所拥有的...
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
你可以这样做:
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
中的单词。我们 return 最后的列表,其中包含所有这些词。
让我知道这是否有意义,或者如果您有任何问题。
编辑:根据@blckknght 的建议,一种更简单的方法是简单地使用集合减法,如下所示:
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
与 the
)视为不同的词。虽然这很容易通过基本的列表理解来解决:text1 = [x.lower() for x in text1]
和 text2 = [x.lower() for x in text2]
.
注意大写单词。示例 "Foo" 和 "foo" 将被视为两个不同的词,而实际上它们是相同的。该代码会将此视为不匹配,并将 return
虽然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()
是一个基本的方法。所以我猜,这可能不算 "obscure internal method".