2013-02-27 61 views
26

的元組存在元素我有元組看起來像列表:檢查的元組

CODES = (
    ('apple', 'reddelicious'), 
    ('caramel', 'sweetsticky'), 
    ('banana', 'yellowfruit'), 
) 

什麼檢查,如果在元組存在一個價值的最佳方式是什麼?例如,我希望能夠說:

'apple' in CODES 

,並獲得真正的

回答

40

您正在尋找any()

if any('apple' in code for code in CODES): 
    ... 

用一個簡單的generator expression相結合,這樣做的任務。生成器表達式採用每個元組,並且如果它包含'apple',則產生Trueany()然後在它請求的第一個項目返回True(否則爲False)時返回True。因此,這就是你想要的。它也很好地讀取 - 如果任何元組包含'apple'

如果你這個做次大規模的數量和需要的性能,那麼它可能是值得的一組中的所有值的讓你做到這一點非常快:自然

cache = set(itertools.chain.from_iterable(CODES))) 

,構建這將會很慢並且會使用內存,所以這不是一個好主意,除非你需要很多性能並且會進行很多會員檢查。

+0

如果不是僅僅檢查是否存在,我想獲得第二個值?在這種情況下「reddelicious」? – 2013-02-28 00:02:18

+4

在這種情況下,你正在使用錯誤的數據結構,使用'dict',然後只做'CODES [「apple」]'(如果它不在那裏,就趕上'KeyError')。 – 2013-02-28 00:04:48

+1

@ 9位只使用'dic = dict(CODES)',這將返回一個字典。然後'dic ['apple']'會導致''reddelicious''。 – 2013-02-28 00:10:19

7

您可以使用itertools.chain()

使用它與in會導致短路,類似於any()

In [30]: CODES = (
    ....:  ('apple', 'reddelicious'), 
    ....:  ('caramel', 'sweetsticky'), 
    ....:  ('banana', 'yellowfruit'), 
    ....:) 


In [31]: from itertools import chain 

In [32]: 'apple' in chain(*CODES) 
Out[32]: True 

In [33]: 'foo' in chain(*CODES) 
Out[33]: False 

對於性能比較你可以檢查我的other answer

+2

+1,這是一個合理的方式來做到這一點 - 我不知道它如何比較性能。儘管你應該在'chain(*)'上使用'chain.from_iterable()'。 – 2013-02-27 23:51:35

+0

@Lattyware我認爲'any()'和我的方法都在做短路,所以對於大數據來說性能差異應該可以忽略不計。 – 2013-02-28 00:07:25