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

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)

现在这很奇怪,它只是给出了"页脚","标题"而不是过滤它们?

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

Vin*_*ard 7

你的逻辑是正确的,因为你像人一样思考.你的电脑没有.他从列表中读取每个元素,然后偶然发现"页脚".他说,"页脚与页脚不同吗?" "不!它是相同的字符串!它被评估为假.让我们看看下一个条件"."页脚与标题不同吗?是的!" 因此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语言本身.