列表理解返回错误的结果

时间:2013-07-10 07:29:13

标签: 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))
        ]
]

语句是:获取总和为零的所有元组,但其中没有一个元素应该为0。

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

5 个答案:

答案 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) ]