3

私はずっと探していましたが、これを理解することができませんでした。

私は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 が含まれていてはなりません。

常に、この結果はすべてのタプルで構成されます。:(

4

5 に答える 5

9

間違った演算子を使用しています。ブール値andが必要です。&ビット演算子です:

[(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()関数を使用して、ネストされたループの代わりにすべての組み合わせを生成し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ただし、セットから the を省略して、自分で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)]
于 2013-07-10T07:31:31.880 に答える
3

他の人がすでに言ったように、間違った演算子を使用しています。

ブール値のみを結合する (または、むしろ結合しようとする) ため、それ自体は問題になりません。

ただし、&and演算子の優先順位は異なります。

(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はほぼすべてのデータに当てはまります。

于 2013-07-10T07:48:51.843 に答える
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) ]
于 2013-07-10T07:45:01.763 に答える