2013-07-10 87 views
3

我一直在寻找所有,但无法找出这件事。列表理解返回错误结果

我来自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。这个结果总是由所有元组组成。 。:(

+2

外部理解的原因是什么?它实际上并没有做任何有用的事情,但你必须有写作的理由。 – user2357112

+0

真的,我第一次尝试没有它..但它仍然没有工作..因此,我看到它是否适用于它.. – abhididdigi

回答

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至g enerate所有的组合,而不是嵌套循环,并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)] 
+0

谢谢,我曾尝试使用&&但现在我知道我应该使用过,并且 – abhididdigi

9

在蟒蛇,&有点符对于你的需要,你应使用and

+0

此外,不同的优先顺序是一个大问题。 – glglgl

1

其他人正在解决错误的问题。 是的, and是合乎逻辑的,而 &是按位进行的,但由于操作数是布尔值,所以它实际上不会影响您的代码。 哎呦;这实际上会影响你的代码,因为优先级是不同的。除此之外,虽然,你有一个错字:

i+j+k > 0 

应该

i + j + k == 0 

,如果你想其总和为0

+0

是的,谢谢你的帮助改变了它 - 我的问题其实是围绕着运营商.. – abhididdigi

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) ] 
+0

速度不够快,可以使用重复itertools.product的参数,如@Martijn所示 – geertjanvdk

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似乎几乎所有的数据是真实的。

+0

感谢您花时间解释这种差异。 – abhididdigi