Python列表推导式中not in与or/and逻辑误用问题求助
逻辑运算符与列表筛选的问题解答
核心逻辑梳理
你要筛选的是**既不含'enc'也不含'lag'**的元素,对应的逻辑应该是:元素中没有'enc' 并且 没有'lag',所以必须用and,而不是or。
为什么用or会得到错误结果
('enc' not in _) or ('lag' not in _)的逻辑是:只要元素不同时包含'enc'和'lag',就会被选中。逐个分析你的列表元素:
- 'enc_1':不含'lag' → 满足条件,被选中
- 'enc_2':不含'lag' → 满足条件,被选中
- 'enc_lag':同时包含'enc'和'lag' → 两个条件都不满足,不被选中
- 'lag_1':不含'enc' → 满足条件,被选中
- 'lag_2':不含'enc' → 满足条件,被选中
- 'price'、'price_std':既不含'enc'也不含'lag' → 满足条件,被选中
这就导致你得到了包含大部分元素的错误结果。
正确的筛选方式
根据德摩根定律:否定“包含enc或包含lag”,等价于“不包含enc并且不包含lag”。所以正确的列表推导式是:
[_ for _ in A if ('enc' not in _) and ('lag' not in _)]
运行后会得到预期结果:['price', 'price_std']
补充验证
你第一次筛选包含'enc'或'lag'的元素时,用('enc' in _) or ('lag' in _)是完全正确的。它的否定就是你需要的“既不含enc也不含lag”,根据德摩根定律,否定式展开后就是('enc' not in _) and ('lag' not in _),和上面的结论完全一致。
内容的提问来源于stack exchange,提问作者User
相关产品推荐
相关产品推荐

