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

问题描述 投票:2回答:2

我有以下有效的代码

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

非常感谢!

python list modulus any
2个回答
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


2
投票

[i for i in range(1, 16) if not any(i % j == 0 for j in [3,5])]

© www.soinside.com 2019 - 2024. All rights reserved.