2012-05-17 70 views
3

假設的價值,我們有下面的一組,S和價值v測試在元組

S = {(0,1),(2,3),(4,5)} 
v = 3 

我要測試是否v是任何一組內的對的第二個元素。我目前的做法是:

for _, y in S: 
    if y == v: 
     return True 
return False 

我真的不喜歡這一點,因爲我必須把它放在一個單獨的功能和東西是告訴我大概有一個更好的方式來做到這一點。任何人都可以點亮一下嗎?

回答

6

any功能是量身訂做的:

any(y == v for (_, y) in S) 

如果你有一大組不經常更改,您可能希望投影的y值到一組。

yy = set(y for (_, y) in S) 
v in yy 

當然,如果你計算yyS後一次變化,而不是每前成員測試,這是隻有好處。

2

你不能做一個O(1)查找,所以你沒有從一個集合中獲得很多好處。你可能會考慮構建第二套,特別是如果你會做很多的查找。

S = {(0,1), (2,3), (4,5)} 
T = {x[1] for x in S} 

v = 3 
if v in T: 
    # do something 
1

微不足道的答案是any(見馬塞洛的回答)。

替代是zip

>>> zip(*S) 
[(4, 0, 2), (5, 1, 3)] 
>>> v in zip(*S)[1] 
True