2013-10-07 75 views
0

我有一個三維座標元組(x,y,z)。我想測試一個給定元組的三個共同點中沒有一個在(a,b,c)以下,沒有一個高於(d,e,f)。 經過反覆試驗,錯誤和讀取這些論壇我知道了:Python Tuple比較不適用於多個小於,多於

(A,B,C)= <(X,Y,Z)= <(d,E,F)

沒有按在第一個表達式評估時不工作,然後獲得該結果(0或1)並在下一次評估中使用它,依此類推。 所以現在我嘗試:

((A,B,C)< =(X,Y,Z))和((X,Y,Z)< =(d,E,F))

這不起作用,因爲當它在三個配對比較(a,x; b,y; c,z;等)中的任何一箇中都達到真時,結果爲True。因此,元組比較更像十進制值而不是三個單獨的標量變量。我需要所有三對比較(總共六個)的任何失敗來產生假結果,而不是產生真的任何成功。

我希望有一種簡單得像< = b < = c的方法。 什麼是這樣做的元組只有當所有成對比較都通過時才產生True的簡單方法?

回答

3

假設你lowerupper約束,以及你的觀點是三元組,試試這個:

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) 
+0

我想說你和falsetru都給出了最好的答案。在仔細研究了弗勒特魯的回答之後,我開始談到你提出的python方法,Tobias。感謝你們兩位! – FacesOfMu

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 
1

經過反覆試驗,錯誤,並閱讀這些論壇,我瞭解到,[...]不起作用...

除了它,因爲Python鏈關係運算符。

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

這不起作用,或者是因爲當它擊中一個真正的在任何三次配對比較[...],它會導致真。

除Python比較全部兩個序列操作數(相同類型)的元素。

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

請確認您實際上使用Python,因爲這兩個觀察結果是它錯誤的。

+0

當我打印(35,43,29)<=(40,40,40)時,我變爲True。我希望我的測試給我的答案是錯誤的,因爲43不小於或等於40.你是否得到了不同的東西,或者我有更少的偏差和更大的偏差再次混合? :) – FacesOfMu

+0

然後你需要在問題中指定。 –

+0

如果注意到