我有以下有效的代码
[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]
非常感谢!
您需要取消条件和切换到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
。
[i for i in range(1, 16) if not any(i % j == 0 for j in [3,5])]