Python 3.5中含or条件的if any语句编写问题求助
解决你的列表元素匹配问题
首先得指出你原来代码里的两个核心问题:
- 第一个写法里的
(y in colorsA for y in colorsC)是个生成器表达式,在布尔判断中,生成器对象本身会被视为True,所以不管实际内容如何,这个分支永远会触发,直接打乱了你的逻辑。 - 第二个写法的逻辑完全偏离需求:它判断的是「colorsB里没有元素在colorsA中」或者「colorsC里没有元素在colorsA中」,而你要的是「某个元素在colorsA里,同时既不在colorsB也不在colorsC里」。
简便高效的实现方式
最直接的优化思路是先把colorsB和colorsC转换成集合(集合的成员检查比列表快得多,尤其是数据量较大时),然后遍历colorsA的每个元素做判断:
colorsA = ['red', 'yellow', 'green'] colorsB = ['red', 'white', 'blue'] colorsC = ['white', 'blue', 'green'] # 转成集合提升查询效率 setB = set(colorsB) setC = set(colorsC) for color in colorsA: if color not in setB and color not in setC: print(color) # 输出: yellow
为什么这样可行?
- 集合的
in操作时间复杂度是O(1),比列表的O(n)高效很多,当你的列表包含大量元素时优势会非常明显。 - 这里的逻辑完全匹配你的需求:遍历colorsA中的每个颜色,当它既不在colorsB的集合里,也不在colorsC的集合里时,就输出它。
如果你想直接得到符合条件的元素列表,也可以用一行列表推导式搞定:
result = [color for color in colorsA if color not in setB and color not in setC] print(result) # 输出: ['yellow']
内容的提问来源于stack exchange,提问作者Dantuzzo
相关产品推荐
相关产品推荐

