-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 を含めたい。

4

3 に答える 3

4

それでもワンライナーが必要な場合は、次のものが実際に読み取り可能です。

[i for i in itertools.product(range(-3, 3), repeat=3) 
 if any(i) and sum(i) == 0]
于 2013-07-13T13:26:13.283 に答える
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)Trueij

追加(k!=0)すると例がより複雑になりますが、考え方は同じです。

于 2013-07-13T13:18:10.300 に答える