0

3D 座標タプル (x、y、z) があります。特定のタプルの 3 つの座標のいずれも (a、b、c) を下回らず、(d、e、f) を上回っていないことをテストしたいと考えています。試行錯誤し、これらのフォーラムを読んで、次のことを学びました。

(a, b, c) <= (x, y, z) <= (d, e, f)

最初の式が評価され、その結果 (0 または 1) を取得して次の評価で使用するなど、機能しません。だから今私は試しました:

((a, b, c) <= (x, y, z)) および ((x, y, z) <= (d, e, f))

3 つのペアの比較 (a、x; b、y; c、z; など) のいずれかで True にヒットすると、結果が True になるため、これも機能しません。そのため、タプルの比較は、3 つの個別のスカラー変数ではなく、10 進数の値のように機能します。True を生成するための成功ではなく、False の結果を生成するためには、3 つのペア比較 (合計 6 つ) すべての失敗が必要です。

私は a <= b <= c のようにとてもシンプルなメソッドを望んでいました。すべてのペアワイズ比較がパスした場合にのみ True を生成するタプルでこれを行う簡単な方法は何ですか?

4

3 に答える 3

3

によるとExpression - Comparison

タプルとリストは、対応する要素の比較を使用して辞書的に比較されます。...

独自の比較関数を定義します。

>>> def lte(x, y):
...     return all(a <= b for a, b in zip(x, y))
... 
>>> lte((1,2,3), (2,3,4))
True
>>> lte((1,2,3), (0,3,4))
False
>>> lte((1,2,3), (2,3,4)) and lte((2,3,4), (3,4,5))
True
>>> lte((1,2,3), (2,3,4)) and lte((2,3,4), (3,2,5))
False
于 2013-10-07T09:49:24.003 に答える
3

lowerあなたのand upperbound と point が3つのタプルであると仮定して、これを試してください:

lower = 1,2,3
upper = 5,2,7
xyz = 2,3,4

all(u <= j <= v for u, j, v in zip(lower, xyz, upper))

または、それらを個別に比較します。

(a <= x <= d) and (b <= y <= e) and (c <= z <= f)
于 2013-10-07T09:49:51.930 に答える
1

試行錯誤し、これらのフォーラムを読んで、[...] が機能しないことを知りました...

ただし、Python は関係演算子を連鎖するためです。

>>> 3 < 4 < 5
True
>>> 5 > 4 > 3
True

3 つの対になった比較のいずれかで True にヒットすると [...]、結果が True になるため、これも機能しません。

ただし、Pythonは両方のシーケンス オペランド (同じ型) のすべての要素を比較します。

>>> (1, 2, 3) >= (1, 2, 4)
False

両方の観察が間違っているため、実際に Python を使用していることを確認してください。

于 2013-10-07T09:51:39.797 に答える