abh*_*igi 3 python list-comprehension
我一直在寻找,但无法解决这个问题.
我来自Java背景,如果有帮助,试图学习python.
a = [
(i,j,k) for (i,j,k) in [
(i,j,k) for i in {-4,-2,1,2,5,0}
for j in {-4,-2,1,2,5,0}
for k in {-4,-2,1,2,5,0} if (i+j+k > 0 & (i!=0 & j!=0 & k!=0))
]
]
Run Code Online (Sandbox Code Playgroud)
声明是:获取总和为零的所有元组,但其中没有一个元素应该为0.
总是,这个结果包含所有元组.:(
您使用的是错误的运算符.你想要布尔值and ; &是一个按位运算符:
[(i,j,k) for (i,j,k) in [(i,j,k) for i in {-4,-2,1,2,5,0} for j in {-4,-2,1,2,5,0} for k in {-4,-2,1,2,5,0} if (i+j+k > 0 and (i!=0 and j!=0 and k!=0)) ] ]
Run Code Online (Sandbox Code Playgroud)
您可以消除嵌套列表理解,这是多余的:
[(i,j,k) for i in {-4,-2,1,2,5,0} for j in {-4,-2,1,2,5,0} for k in {-4,-2,1,2,5,0} if (i+j+k > 0 and (i!=0 and j!=0 and k!=0))]
Run Code Online (Sandbox Code Playgroud)
接下来,使用该itertools.product()函数生成所有组合而不是嵌套循环,并all()测试所有值是否为非零:
from itertools import product
[t for t in product({-4,-2,1,2,5,0}, repeat=3) if sum(t) > 0 and all(t)]
Run Code Online (Sandbox Code Playgroud)
但你也可以省略0集合并保存自己的all()测试:
from itertools import product
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) > 0]
Run Code Online (Sandbox Code Playgroud)
也许你想将该测试更正为等于 0:
from itertools import product
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) == 0]
Run Code Online (Sandbox Code Playgroud)
结果:
>>> [t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) == 0]
[(1, 1, -2), (1, -2, 1), (2, 2, -4), (2, -4, 2), (-4, 2, 2), (-2, 1, 1)]
Run Code Online (Sandbox Code Playgroud)