2013-02-27 76 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