2012-04-28 30 views
3

所以我知道comparisons on tuples工作字典序:兩個元組的所有元素(包括所有()功能)比較

元組和列表的字典順序使用相應元素的比較比較。這意味着爲了比較相等,每個元素必須相等並且兩個序列必須是相同類型並且具有相同長度。

如果不相等,則序列是有序的與它們的第一不同的元件。例如,CMP([1,2,X],[1,2,Y])返回相同CMP(X,Y)。如果相應的元素不存在,則較短的序列首先被排序(例如,[1,2] < [1,2,3])。

從這個

所以:

>>> a = (100, 0) 
>>> b = (50, 50) 
>>> a > b 
True 

,但我想,以2元組的所有元素進行比較,所以在功能上我想要的東西,類似於(使用上面的值):

>>> a > b 
(True, False) #returned tuple containing each comparison 
>>> all(a > b) 
False 

在實踐中例如,對於類似的屏幕座標,如果你想檢查,如果事情是「內部」(0,0)的屏幕,但做過類似座標的比較>(0,0),如果x座標大於0,但y座標較小,它仍然會返回true,這不是這種情況下需要的。

作爲一種子問題/討論:
我不知道爲什麼比較兩個不同值的元組以這種方式返回。您還沒有給出任何形式的指數,讓你從比較的元組(未測試平等)得到的唯一的事情是,在元組的一些點,攀比的人會拋出一個true或false值時,他們不等於。你怎麼能利用這一點?

+0

的元組比較有用的情況是版本號; '(3,1,4,2)<(3,2,0,1)'之類的東西 – 2012-04-28 00:33:39

回答

7

你可以用一個列表理解和內置的ZIP實現這一點:

>>> a = (100, 0) 
>>> b = (50, 50) 
>>> [(a > b) for a, b in zip(a,b)] 
[True, False] 

您可以在返回的列表上使用的所有()或()。

+2

如果你打電話'all'或'any'那麼你不再需要列表理解,但可以脫身生成器,由於特殊的語法規則,您可以刪除多餘的括號。 – 2012-04-28 00:39:04

1

你的第二個代碼示例中替換a > btuple(i > j for i, j in zip(a,b))

>>> a = (100, 0) 
>>> b = (50, 50) 
>>> tuple(i > j for i, j in zip(a,b)) 
(True, False) 
>>> all(i > j for i, j in zip(a,b)) 
False 
0

要獲得所描述的行爲,請嘗試:

[ai > bi for ai,bi in zip(a,b)] 

元組的比較,以這種方式返回的原因是,你可能想要寫的東西,如:

if a >= (0.,0.): 
    print "a has only positive values" 
else: 
    print "a has at least one negative value" 

如果Python返回你描述的元組,那麼其他元素就不會發生。嘗試

if (False,False): 
    print "True!" # This is what is printed. 
else: 
    print "False!" 

我希望這會有所幫助。

1

您可以考慮使用以下量化方法,這通常是更好的性能,和語法/語義很明確:

>>> import numpy 
>>> 
>>> a = (100, 0) 
>>> b = (50, 50) 
>>> numpy.array(a) > b 
array([ True, False], dtype=bool) 
>>> 
>>> (numpy.array(a) > b).any() 
True 
>>> (numpy.array(a) > b).all() 
False 
  • numpy的是相當高性能,以上還嵌入得到的對象所需的any()/ all()查詢方法。如果您將執行類似向量的操作(如您的屏幕座標示例所示),您可以考慮將'a'和'b'作爲numpy數組而不是元組。這樣可以實現您尋求的最有效的實現:不需要預轉換,並且基於Python的循環被高效的基於numpy的循環替代。這值得強調,因爲有兩個可能的三個循環:(1)轉換過程中的預處理循環(可以消除); (2)逐項比較循環;和(3)查詢循環來回答任何/所有問題。

  • 請注意,我也已經從「B」創造了一個numpy的數組,但不這樣做消除的一種轉換步驟和預處理時間。因爲該方法導致一個操作數是一個numpy的陣列,另一個是元組,隨着序列增加,其可以/可能-不導致更少的迅速項逐項比較(其中嚴格numpy的到numpy的擅長)。嘗試一下。 :)

0

我感覺就像使用地圖和lambda函數從答案失蹤

>>> a = (100, 0) 
>>> b = (50, 50) 
>>> all(map(lambda x,y: x > y, a, b) 
False 
相關問題