列表理解返回错误的结果

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.

总是,这个结果包含所有元组.:(

zha*_*gyu 9

在python中,&有点操作符.根据您的需要,您应该使用and.


Mar*_*ers 9

您使用的是错误的运算符.你想要布尔值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)