Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.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_List_Logic_Filtering_Sequence - Fatal编程技术网

筛选Python列表时出现意外输出:我做错了什么?

筛选Python列表时出现意外输出:我做错了什么?,python,list,logic,filtering,sequence,Python,List,Logic,Filtering,Sequence,我正在尝试筛选列表,以下是代码: test=['aaa','bbb','ccc','ddd','footer','header'] def rm_hf(x): return x != 'footer' filter(rm_hf,test) 结果: >>>['aaa','bbb','ccc','ddd','header'] >>>['aaa','bbb','ccc','ddd','footer','header'] 这是预期的结果,在列表中找到“

我正在尝试筛选列表,以下是代码:

 test=['aaa','bbb','ccc','ddd','footer','header']

 def rm_hf(x): return x != 'footer'

 filter(rm_hf,test)
结果:

>>>['aaa','bbb','ccc','ddd','header']
>>>['aaa','bbb','ccc','ddd','footer','header']
这是预期的结果,在列表中找到“footer”并将其删除

现在我想删除“页眉”和“页脚”,所以我要这样做:

 test2=['aaa','bbb','ccc','ddd','footer','header']

 def rm_hf2(x): return x != 'footer' or x != 'header'

 filter(rm_hf2,test2)
结果:

>>>['aaa','bbb','ccc','ddd','header']
>>>['aaa','bbb','ccc','ddd','footer','header']
现在这很奇怪,它只是给出“页脚”和“页眉”而不是过滤它们


我做错了什么?我认为我的逻辑是正确的…

你的逻辑是正确的,因为你像人一样思考。你的电脑没有。他读了你列表中的每一个元素,然后偶然发现了“页脚”。“页脚和页脚不同吗?”他说。“不!是同一个字符串!计算结果为false。让我们看看下一个条件。”。“页脚与页眉不同吗?是!”因此,条件为
False或True,其计算结果显然为True

您想要的是
,而不是

def rm_hf2(x): return x != 'footer' and x != 'header'
您还可以在
关键字中使用元组和,这样更易于阅读:

def rm_hf2(x): return x not in ('footer', 'header')

不过,了解“和”和“或”的真正含义很重要。老实说:如果某些东西没有按照您认为应该的方式工作,那么问题很可能在于您自己的代码,而不是Python语言本身。

您的逻辑是正确的,因为您像人一样思考。你的电脑没有。他读了你列表中的每一个元素,然后偶然发现了“页脚”。“页脚和页脚不同吗?”他说。“不!是同一个字符串!计算结果为false。让我们看看下一个条件。”。“页脚与页眉不同吗?是!”因此,条件为
False或True,其计算结果显然为True

您想要的是
,而不是

def rm_hf2(x): return x != 'footer' and x != 'header'
您还可以在
关键字中使用元组和,这样更易于阅读:

def rm_hf2(x): return x not in ('footer', 'header')

不过,了解“和”和“或”的真正含义很重要。老实说:如果某些东西没有按照您认为应该的方式工作,那么问题很可能在于您自己的代码,而不是Python语言本身。

其他人都这么说,另外:

当您有多个要排除的项目时,请使用
集合
,而不是
s链或
元组

# do once
blacklist = set(['header', 'footer'])

# as needed
filter(lambda x: x not in blacklist, some_iterable)

理由:查看
元组
需要的时间与找到的项目的位置成比例;失败时间与最后一项相同。在集合中查找一个项目对所有项目和失败都需要相同的时间。集合通常会赢得大量项目。这完全取决于每个项目被搜索的概率,以及失败的概率。即使收集了大量的数据,当少数项目的概率很高(它们应该放在数据组的前面)且失败的几率很低时,数据组也可以获胜。

其他人都说了什么,另外:

当您有多个要排除的项目时,请使用
集合
,而不是
s链或
元组

# do once
blacklist = set(['header', 'footer'])

# as needed
filter(lambda x: x not in blacklist, some_iterable)

理由:查看
元组
需要的时间与找到的项目的位置成比例;失败时间与最后一项相同。在集合中查找一个项目对所有项目和失败都需要相同的时间。集合通常会赢得大量项目。这完全取决于每个项目被搜索的概率,以及失败的概率。即使有大量的集合,元组也可以获胜,因为只有少数项(它们应该放在元组的前面)的概率很高,失败的概率很低。

您也可以使用列表理解而不是筛选

test = ['aaa','bbb','ccc','ddd','footer','header']
filtered_test = [x for x in test if x not in ('footer', 'header')]
或生成器表达式(取决于您的需要)


您还可以使用列表理解而不是过滤器

test = ['aaa','bbb','ccc','ddd','footer','header']
filtered_test = [x for x in test if x not in ('footer', 'header')]
或生成器表达式(取决于您的需要)

我的逻辑是正确的

事实上,没有,正如其他答案所强调的那样

实现预期结果的一个更简洁的方法是使用,即:

发件人:

请注意,
过滤器(函数,iterable)
相当于
如果
函数
不是
如果
函数
,则
过滤器(函数,iterable)
相当于
如果
函数

这就是说,没有时间像现在这样重温你的生活了

如果对代码进行单元测试,您会很快发现第二个过滤函数并没有达到预期效果。下面是一个简单的例子:

$ cat 4281875.py 
#!/usr/bin/env python

import unittest

def rm_hf2(x): return x != 'footer' or x != 'header'

class test_rm_hft(unittest.TestCase):

    def test_aaa_is_not_filtered(self):
        self.assertTrue(rm_hf2('aaa'))

    def test_footer_is_filtered_out(self):
        self.assertFalse(rm_hf2('footer'))


if __name__ == '__main__':
    unittest.main()


$ ./4281875.py 
.F
======================================================================
FAIL: test_footer_is_filtered_out (__main__.test_rm_hft)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./4281875.py", line 13, in test_footer_is_filtered_out
    self.assertFalse(rm_hf2('footer'))
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=1)
我的逻辑是正确的

事实上,没有,正如其他答案所强调的那样

实现预期结果的一个更简洁的方法是使用,即:

发件人:

请注意,
过滤器(函数,iterable)
相当于
如果
函数
不是
如果
函数
,则
过滤器(函数,iterable)
相当于
如果
函数

这就是说,没有时间像现在这样重温你的生活了

如果对代码进行单元测试,您会很快发现第二个过滤函数并没有达到预期效果。下面是一个简单的例子:

$ cat 4281875.py 
#!/usr/bin/env python

import unittest

def rm_hf2(x): return x != 'footer' or x != 'header'

class test_rm_hft(unittest.TestCase):

    def test_aaa_is_not_filtered(self):
        self.assertTrue(rm_hf2('aaa'))

    def test_footer_is_filtered_out(self):
        self.assertFalse(rm_hf2('footer'))


if __name__ == '__main__':
    unittest.main()


$ ./4281875.py 
.F
======================================================================
FAIL: test_footer_is_filtered_out (__main__.test_rm_hft)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./4281875.py", line 13, in test_footer_is_filtered_out
    self.assertFalse(rm_hf2('footer'))
AssertionError

----------------------------------------------------------------------
Ran 2 tests in 0.000s

FAILED (failures=1)

这是逻辑错误的另一种解释:他认为他写的
不是(x=='footer'或x=='header')
,而是写的
(不是x=='footer')或(不是x=='header')
。@THC4k:这是可能的,尽管当你的意思是“不应该是其中任何一个”时,写
是初学者的常见错误.另一种解释:他没有读他写的过滤函数,或者他没有测试他写的过滤函数。非常感谢!,我在想THC4K说的话这也是我第一次使用过滤器。下面是对逻辑错误的另一种解释:他认为他写的
不是(x=='footer'或x='header')
,而是写的
(不是x='footer')或(不是x='header')
。@THC4k:这是可能的,尽管这是一个普通的初学者m