筛选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