列表理解python中的复杂if表达式

列表理解python中的复杂if表达式,python,Python,我在列表中有一个if表达式: [(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。要省略(I,j,k)仅当它们都为零时,使用条件(I,j,k)!=(0,0,0): 印刷品 [(-3

我在列表中有一个if表达式:

[(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。

要省略
(I,j,k)
仅当它们都为零时,使用条件
(I,j,k)!=(0,0,0)

印刷品

[(-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)和(j!=0)以及(k!=0)

考虑当
i=0
j=1
时会发生什么:

| i != 0 | j != 0 | (i!=0) and (j!=0) | (i,j) != (0,0) |
| False  | True   | False             | True           |
(i!=0)和(j!=0)
False
,因为
False和True
False
。 相反,
(i,j)!=(0,0)
始终为
True
,除非
i
j
都为零


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

您可以使用
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

这要简单得多。。。(如果这是您想要做的!)

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

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

你为什么不把它分成三行作为起点呢。。。。?(为什么它们都支持
S
中的任何内容…)?如果您在多行上编写此代码,您将有足够的空间编写一些漂亮的注释,解释它的功能。现在这很难解决。你也可以使用
not(i==j==k==0)
@eyquem:OP在一条现已删除的评论中解释说,他想要所有元组
(i,j,k)
,除非
(i,j,k)==(0,0,0)
。我把他的评论添加到了原来的帖子里,这样问题就更清楚了。对不起。我本应该认为,OP方面的错误比你方面的错误更有可能发生
不是
指的是身份,不是平等:你想要
=取而代之。当我运行此代码时,我在
S
中得到
(0,0,0)
,因为您在listcomp中构造的元组与您从
icwr
@DSM aaah返回的元组不同。我一直怀疑这一点,但从来没有检查过。@eyquem有一条评论来自OP对一个现已删除的答案的评论:“问题是,当I、j和k中的一个为0时,元组没有被添加,这不是我想要的。我只想在它们都为0时发出”我会写
。。。如果sum(i)和any(i)
,因为sum(i)等于零的情况比唯一情况i==(0,0,0)更多,请原谅。我没有看到这部分。。。或者我在月球上有想法。联合国大学已经向我解释过了。我将在几分钟后删除此评论
[i for i in itertools.product(range(-3, 3), repeat=3) 
 if any(i) and sum(i) == 0]