我一直在寻找,但却无法解决这个问题。
我来自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))
]
]
语句是:获取总和为零的所有元组,但其中没有一个元素应该为0。
总是,这个结果包含所有元组。 :(
答案 0 :(得分:9)
在python中,&
是一个位运算符。根据您的需要,您应该使用and
。
答案 1 :(得分:9)
您使用的操作符错误。你想要boolean and
; &
is a bitwise operator:
[(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)) ] ]
您可以消除嵌套列表理解,这是多余的:
[(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))]
接下来,使用itertools.product()
function生成所有组合而不是嵌套循环,并使用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)]
但您也可以省略集合中的0
并自行保存all()
测试:
from itertools import product
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) > 0]
也许您想将该测试更正为等于为0:
from itertools import product
[t for t in product({-4,-2,1,2,5}, repeat=3) if sum(t) == 0]
结果:
>>> [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)]
答案 2 :(得分:3)
正如其他人已经说过的那样,你使用了错误的算子。
这本身不会成为问题,因为你只是组合(或者更确切地说,尝试组合)布尔值。
但&
和and
运算符有不同的precedence。
(i+j+k > 0 and (i!=0 and j!=0 and k!=0))
是正确的,因为and
的优先级高于>
和!=
。
然而,
(i+j+k > 0 & (i!=0 & j!=0 & k!=0))
原来是
(i+j+k > (0 & (i != (0 & j) != (0 & k) !=0)))
这使右手评估为0
,表达式i + j + k > 0
似乎适用于几乎所有数据。
答案 3 :(得分:1)
其他人正在解决错误的问题。 是的,哎呀;实际上确实会影响您的代码,因为优先级不同。除此之外,你有一个错字:and
是合乎逻辑的,&
是按位的,但由于操作数是布尔值,它实际上并不会影响你的代码。
i+j+k > 0
应该是
i + j + k == 0
如果你想要总和为0的元组。
答案 4 :(得分:1)
使用itertools.product和sum():
from itertools import product
list1 = (-4,-2,1,2,5,0)
list2 = (-4,-2,1,2,5,0)
print [ couple for couple in product(list1, list2) if not sum(couple) ]