我的最终目标是打印一个文件中存在而另一个文件中不存在的项目的列表。
我尝试将每个文件更改为一个列表并比较列表,但是它仍会打印出第一个列表中的所有项目。 (除了比较列表外,还可以使用其他方法)
File1水果
apples
bananas
blueberries
watermelons
oranges
kiwis
File2吃了
I like to eat apples
I like to eat bananas
I like to eat oranges
I like to eat watermelon
示例脚本
fruitList = [line.rstrip('\n') for line in open("fruits")]
eatsList = [line.rstrip('\n') for line in open("eats")]
for item in fruitList:
if item not in eatsList:
print(item)
这只是我为达到最终目标而尝试创建的一个小样本
我想将Fruits文件与Eats文件进行比较,只找到Eats文件中不存在的水果
因此end应该是一个仅包含 蓝莓 猕猴桃
除了对2个列表进行比较之外,我还接受其他方法,要比较的最终文件将有7至12,000行可以相互比较
答案 0 :(得分:1)
您正在比较两个文件之间的行,而不是比较单词。您可以列出这样的单词列表,然后您的代码应该可以工作:
with open("fruits") as f:
fruitList = [
word
for line in f
for word in line.rstrip('\n').split(" ")
]
with open("eats") as f:
eatsList = [
word
for line in f
for word in line.rstrip('\n').split(" ")
]
for item in fruitList:
if item not in eatsList:
print(item)
或者您可以通过使用set和set操作使其更高效:
with open("fruits") as f:
fruits_set = {
word
for line in f
for word in line.rstrip('\n').split(" ")
}
with open("eats") as f:
eats_set = {
word
for line in f
for word in line.rstrip('\n').split(" ")
}
missing_items = fruits_set - eats_set
答案 1 :(得分:0)
将它们作为集合进行处理,并假设水果是硬道理:
fruitSet = {line.rstrip('\n') for line in open("fruits")}
eatsSet = {line.rstrip('\n').split()[-1] for line in open("eats")}
print(fruitSet - eatsSet)
输出:
{'watermelons', 'blueberries', 'kiwis'}
请注意,这不处理单数/复数。在一般情况下,要解决此问题,您可能需要使用nltk之类的库。
答案 2 :(得分:0)
您必须检查eatsList
元素中的匹配项,而不是eatsList
本身。 any
/ all
可以帮助您:
for item in fruitList:
if not any(item in s for s in eatsList):
print(item)
等效:
for item in fruitList:
if all(item not in s for s in eatsList):
print(item)
答案 3 :(得分:0)
原因是,大致来说,您从第一个文件中获得的list
包含 words ('apples'
,'bananas'
,而您获得的来自第二个文件的句子('I like to eat apples'
,'I like to eat bananas'
)。
因此,您将需要对第二个文件执行额外的处理,以将其更改为与第一个文件相同的格式:
from itertools import chain
with open('eats') as f:
eats_words = set(chain.from_iterable(row.strip().split() for row in f))
with open('fruits') as f:
fruits_words = {word.strip() for word in f if word.strip() not in eats_words}