Phy*_*win 1 python logic filtering list sequence
我想过滤一个列表,这里是代码:
test=['aaa','bbb','ccc','ddd','footer','header']
def rm_hf(x): return x != 'footer'
filter(rm_hf,test)
Run Code Online (Sandbox Code Playgroud)
结果是 :
>>>['aaa','bbb','ccc','ddd','header']
Run Code Online (Sandbox Code Playgroud)
这是预期的结果,在列表中找到"页脚"并将其删除.
现在我想删除'header'和'footer',所以我这样做:
test2=['aaa','bbb','ccc','ddd','footer','header']
def rm_hf2(x): return x != 'footer' or x != 'header'
filter(rm_hf2,test2)
Run Code Online (Sandbox Code Playgroud)
结果是 :
>>>['aaa','bbb','ccc','ddd','footer','header']
Run Code Online (Sandbox Code Playgroud)
现在这很奇怪,它只是给出了"页脚","标题"而不是过滤它们?
我做错了什么?我认为我的逻辑是正确的......
你的逻辑是正确的,因为你像人一样思考.你的电脑没有.他从列表中读取每个元素,然后偶然发现"页脚".他说,"页脚与页脚不同吗?" "不!它是相同的字符串!它被评估为假.让我们看看下一个条件"."页脚与标题不同吗?是的!" 因此False or True
,条件显然是真实的.
你想要一个and
,而不是一个or
:
def rm_hf2(x): return x != 'footer' and x != 'header'
Run Code Online (Sandbox Code Playgroud)
您还可以使用元组和in
关键字,它更具可读性:
def rm_hf2(x): return x not in ('footer', 'header')
Run Code Online (Sandbox Code Playgroud)
但是,了解"和"和"或"的真实情况非常重要.说实话:如果某些东西没有按你认为的那样工作,问题很可能在于你自己的代码,而不是在Python语言本身.