我有以下有效的代码
[i for i in range(1, 16) if any(i % j == 0 for j in [3,5])]
其输出为 [3、5、6、9、10、12、15],可以除以3或5的数字。
但是,当我尝试
[i for i in range(1, 16) if any(i % j != 0 for j in [3,5])]
我明白了 [1、2、3、4、5、6、7、8、9、10、11、12、13、14]
我正在寻找的是 [1、2、4、7、8、11、13、14]
非常感谢!
答案 0 :(得分:3)
您需要取消条件,切换到all
:
>>> [i for i in range(1, 16) if all(i % j != 0 for j in [3,5])]
[1, 2, 4, 7, 8, 11, 13, 14]
或按原样保留条件并否定any
的结果:
>>> [i for i in range(1, 16) if not any(i % j == 0 for j in [3,5])]
[1, 2, 4, 7, 8, 11, 13, 14]
两者都可以源自De Morgan's laws,其中之一指出
not (A or B) == not A and not B
(泛化为not (A or B or ... ) == not A and not B and ...
)。
any(Ai for i in ...)
等效于A0 or A1 or A2 or ... or An
,all(Ai for i in ...)
等效于A0 and A1 and A2 or ... or An
。
答案 1 :(得分:2)
[i for i in range(1, 16) if not any(i % j == 0 for j in [3,5])]