2012-08-12 19 views
4

假設你有2元組序列:什麼是測試與2元組序列中的第一項元組匹配的最Pythonic方法?

seq_of_tups = (('a', 1), ('b', 2), ('c', 3)) 

,你想測試,如果'a'是序列中任何元組的第一個項目。

什麼是最Pythonic的方式?

轉換爲字典和測試鍵,這似乎很容易理解?即

'a' in dict(seq_of_tups) 

使用一個可愛的拉鍊招除非你知道的伎倆是不是特別清楚?即

'a' in zip(*seq_of_tups)[0] 

還是真的明確地圖?即

'a' in map(lambda tup: tup[0], seq_of_tups) 

或者是否有比這些選擇更好的方法?

+0

'>>> 'A' 的zip(* seq_of_tups) FALSE'我想你的意思'拉鍊(* seq_of_tups)[0]' – jamylak 2012-08-12 14:26:40

+0

是啊,哎呀,謝謝 – Ghopper21 2012-08-12 14:31:30

回答

5
>>> tups = (('a', 1), ('b', 2), ('c', 3)) 

>>> 'a' in (x[0] for x in tups) 
True 
>>> 'd' in (x[0] for x in tups) 
False 

上述解決方案將盡快退出找到a,證明:

>>> tups = (('a', 1),('a',5), ('b', 2), ('c', 3)) 
>>> gen=(x[0] for x in tups) 
>>> 'a' in gen 
True 
>>> list(gen) 
['a', 'b', 'c'] #this result means generator stopped at first 'a' 
+3

顯然Python是足夠聰明到發電機不轉換成一個列表第一個(在itertools.repeat(5)''中用'5測試)。它和Jamylak的解決方案一樣好。 – 2012-08-12 14:32:24

+1

@FelixKling:Huh,所以在生成器中使用'in'就相當於使用'any'。非常酷,我不知道。 – 2012-08-12 14:39:14

+0

兩個很好的答案,感謝Ashwini和jamylak,都比我最初的選擇要好,不僅僅是因爲它們會縮短搜索範圍。似乎我更喜歡Ashwini的解決方案。我喜歡它稍微好一些,因爲它直接表達了「如果這是在列表中」的邏輯,而不是將其反轉爲「如果該列表中的任何事情是這樣的」。 – Ghopper21 2012-08-12 14:44:50

11
>>> seq_of_tups = (('a', 1), ('b', 2), ('c', 3)) 
>>> any(x == 'a' for x, y in seq_of_tups) 
True 

對於任何大小的元組,你可以使用它代替:

any(x[0] == 'a' for x in seq_of_tups) 

這裏也有一些有趣的時刻:

>python -m timeit -s "seq_of_tups = (('a', 1), ('b', 2), ('c', 3))" 
       "any(x == 'a' for x, y in seq_of_tups)" 
1000000 loops, best of 3: 0.564 usec per loop 

>python -m timeit -s "seq_of_tups = (('a', 1), ('b', 2), ('c', 3))" 
       "'a' in (x[0] for x in seq_of_tups)" 
1000000 loops, best of 3: 0.526 usec per loop 

>python -m timeit -s "seq_of_tups = (('a', 1), ('b', 2), ('c', 3)); 
         from operator import itemgetter; from itertools import imap" 
       "'a' in imap(itemgetter(0), seq_of_tups)" 
1000000 loops, best of 3: 0.343 usec per loop 
+3

這是避免穿越的好方法整個列表(當然平均)。 – 2012-08-12 14:25:40

+0

'imap'總是贏。 – 2012-08-12 14:57:33

+0

@AshwiniChaudhary好點,因爲迭代將會停止在第一個帶有「imap」的項目上,並且它總是這種情況下的第一個項目。我將刪除'map' :) – jamylak 2012-08-12 15:01:43

相關問題