Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 提取不包含';不存在于列表中_Python_Python 3.x - Fatal编程技术网

Python 提取不包含';不存在于列表中

Python 提取不包含';不存在于列表中,python,python-3.x,Python,Python 3.x,我的最终目标是打印一个文件中存在而另一个文件中不存在的项目列表 我尝试将每个文件更改为一个列表并比较列表,但它仍然打印出第一个列表中的所有项目。 (也可以使用比较列表以外的其他方法) 水果 apples bananas blueberries watermelons oranges kiwis 文件2吃 I like to eat apples I like to eat bananas I like to eat oranges I like to eat watermelon 示例脚本

我的最终目标是打印一个文件中存在而另一个文件中不存在的项目列表

我尝试将每个文件更改为一个列表并比较列表,但它仍然打印出第一个列表中的所有项目。 (也可以使用比较列表以外的其他方法)

水果

apples
bananas
blueberries
watermelons
oranges
kiwis
文件2吃

I like to eat apples
I like to eat bananas
I like to eat oranges
I like to eat watermelon
示例脚本

fruitList=[line.rstrip('\n')用于打开的行(“fruits”)]
eatsList=[line.rstrip('\n')表示线路处于打开状态(“eats”)]
对于结果列表中的项目:
如果项目不在eatsList中:
打印(项目)
这只是我为实现最终目标而尝试创建的一个小示例

我想将水果文件与eats文件进行比较,只找到eats文件中不存在的水果

所以end应该是一个只包含 蓝莓 猕猴桃


除了一起比较两个列表之外,我还可以使用其他方法,要比较的最终文件将有7-12000行相互比较

将它们视为一组,并假设水果是最后一个词:

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'}

注意,这不处理单数/复数。在一般情况下,要处理此问题,您可能需要使用类似的库。

您必须检查
eatsList
元素中的匹配项,而不是
eatsList
本身<代码>任何/
所有
都可以帮助您:

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)

原因是,粗略地说,从第一个文件中得到的
列表包含单词(
'apples'
'pananas'
),而从第二个文件中得到的列表包含句子(
'I like to eat apples'
'I like to eat pananas'

因此,您需要对第二个文件执行额外处理,以将其更改为与第一个文件相同的格式:

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}

您正在比较两个文件之间的行,而不是比较单词。您可以创建这样的单词列表,然后您的代码应该可以工作:

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)
或者,您可以通过使用集合和集合操作来提高效率:

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

你所需要做的就是把“我喜欢吃”的句子分开,然后记下最后一个字。然后你所做的一切都会起作用。而不是用
eatsList=[line.rstrip('\n')代替line…
do
eatsList=[line.rstrip('\n').split()[-1]对于第行…
。谢谢!我认为这将达到目前为止的效果,或者至少给我一个跳转的分数。