您如何形成“任意”条件的相反陈述?

时间:2019-11-14 14:55:56

标签: python list modulus any

我有以下有效的代码

[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]

非常感谢!

2 个答案:

答案 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 Anall(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])]