我有这个表达式列表中的表达式:
[(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。
答案 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=0
和j=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 True
为False
。
相比之下,(i,j) != (0,0)
始终为True
,除非i
和j
都为零。
添加(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
这更简单......(如果你想做的话!)