复杂如果表达式在列表解析python中

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

标签: python

我有这个表达式列表中的表达式:

[(i,j,k) for i in S for j in S for k in S 
 if ((i+j+k==0) and (i!=0) and (j!=0) and (k!=0))]

但它似乎不是在我的条件之间评估,而是作为或。为什么会这样?

问题是,当i,j和k中的一个为0时,不添加元组,这不是我想要的。我只想在它们全部为0时才发光。即:我希望结果中包含0,3,-3。

3 个答案:

答案 0 :(得分:4)

如果您仍然需要单行,那么以下内容实际上是可读的:

[i for i in itertools.product(range(-3, 3), repeat=3) 
 if any(i) and sum(i) == 0]

答案 1 :(得分:3)

仅当所有为零时忽略(i,j,k),请使用条件(i,j,k) != (0,0,0)

S = range(-3,3)
x = [(i,j,k)
     for i in S
     for j in S
     for k in S
     if ((i+j+k==0)
         and (i,j,k) != (0,0,0))]
print(x)

打印

[(-3, 1, 2), (-3, 2, 1), (-2, 0, 2), (-2, 1, 1), (-2, 2, 0), (-1, -1, 2), (-1, 0, 1), (-1, 1, 0), (-1, 2, -1), (0, -2, 2), (0, -1, 1), (0, 1, -1), (0, 2, -2), (1, -3, 2), (1, -2, 1), (1, -1, 0), (1, 0, -1), (1, 1, -2), (1, 2, -3), (2, -3, 1), (2, -2, 0), (2, -1, -1), (2, 0,
-2), (2, 1, -3)]

要了解原始条件的错误,(i!=0) and (j!=0) and (k!=0)

考虑i=0j=1

时会发生什么
| i != 0 | j != 0 | (i!=0) and (j!=0) | (i,j) != (0,0) |
| False  | True   | False             | True           |

(i!=0) and (j!=0)False,因为False and TrueFalse。 相比之下,(i,j) != (0,0)始终为True,除非ij都为零。

添加(k!=0)会使示例更复杂,但想法是一样的。

答案 2 :(得分:1)

您可以使用itertools ...

大大简化这一过程
from itertools import combinations_with_replacement as icwr

S = [t for t in icwr(range(-3,3),3) if t != (0,0,0)]

print S

这更简单......(如果你想做的话!)