Python:如何在all()函数中正确使用运算符实现多条件校验?
解决字典值多条件检查的问题
哈哈,这个坑我刚学Python的时候也踩过!让我帮你理清楚问题出在哪,以及怎么正确实现你的需求。
为什么你的写法不对?
先拆解你写错的几个表达式,就能明白为什么结果不符合预期:
value == (1 or 2 or 3):
Python里的or是布尔逻辑运算符,它会返回第一个为「真」的值。因为1是真值,所以1 or 2 or 3的结果就是1,你的条件等价于value == 1——完全没检查2和3!value ==1 or 2 or3:
这个表达式的优先级是(value ==1) or 2 or3,而2和3都是真值,不管value是什么,整个表达式永远为True!这就是为什么你字典里有5的时候,代码还输出correct——因为or后面的2直接让条件成立了。
正确的实现方式
这里有几种简洁且正确的写法,按推荐度排序:
方法1:用in运算符配合集合(最推荐)
集合的查找效率最高(O(1)时间复杂度),代码也最简洁:
config = {"a": 1, "b": 1, "c": 1, "d": 3, "e": 5} allowed_values = {1, 2, 3} # 用集合存允许的值 if all(value in allowed_values for value in config.values()): print('correct') else: print('wrong') # 输出:wrong
方法2:完整写出每个比较条件
如果允许的值很少,也可以直接用多个or,但要注意每个条件都要写完整的比较:
config = {"a": 1, "b": 1, "c": 1, "d": 3, "e": 5} if all(value == 1 or value == 2 or value == 3 for value in config.values()): print('correct') else: print('wrong') # 输出:wrong
这种写法虽然可行,但值多了会很冗长,不如用in方便。
方法3:用元组/列表(效率略低于集合)
如果不想用集合,也可以用元组或列表,只是查找效率稍低(O(n)),但对于少量值来说几乎没区别:
config = {"a": 1, "b": 1, "c": 1, "d": 3, "e": 5} if all(value in (1, 2, 3) for value in config.values()): print('correct') else: print('wrong') # 输出:wrong
总结
记住:Python的or是用来做布尔逻辑判断的,不是用来列举可选值的。要检查值是否属于某个允许的集合,用in运算符才是正确的姿势!
内容的提问来源于stack exchange,提问作者Adrien
相关产品推荐
相关产品推荐

