我正在尝试过滤列表,这是代码:
test=['aaa','bbb','ccc','ddd','footer','header']
def rm_hf(x): return x != 'footer'
filter(rm_hf,test)
结果:
>>>['aaa','bbb','ccc','ddd','header']
这是预期的结果,在列表中找到“页脚”并将其删除。
现在我想删除“页眉”和“页脚”,所以我这样做:
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','footer','header']
现在这很奇怪,它只给出'页脚','页眉'而不是过滤它们?
我做错了什么?我认为我的逻辑是正确的...
请您参考如下方法:
你的逻辑是正确的,因为你像人一样思考。你的电脑没有。他阅读了您列表中的每个元素,然后偶然发现了“页脚”。 “页脚与页脚不同吗?”,他说。 “不!这是同一个字符串!它被评估为假。让我们看看下一个条件”。 “页脚与页眉不同吗?是的!”因此,条件为 False 或 True,显然计算结果为 true。
你想要一个and,而不是or:
def rm_hf2(x): return x != 'footer' and x != 'header'
您还可以使用元组和 in 关键字,这更具可读性:
def rm_hf2(x): return x not in ('footer', 'header')
不过,了解“and”和“or”的真正含义很重要。老实说:如果某些东西没有按您认为的那样工作,问题很可能出在您自己的代码中,而不是出在 Python 语言本身。
