的元组存在元素我有元组看起来像列表:检查的元组
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
什么检查,如果在元组存在一个价值的最佳方式是什么?例如,我希望能够说:
'apple' in CODES
,并获得真正的
的元组存在元素我有元组看起来像列表:检查的元组
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
什么检查,如果在元组存在一个价值的最佳方式是什么?例如,我希望能够说:
'apple' in CODES
,并获得真正的
您正在寻找any()
:
if any('apple' in code for code in CODES):
...
用一个简单的generator expression相结合,这样做的任务。生成器表达式采用每个元组,并且如果它包含'apple'
,则产生True
。 any()
然后在它请求的第一个项目返回True
(否则为False
)时返回True
。因此,这就是你想要的。它也很好地读取 - 如果任何元组包含'apple'
。
如果你这个做次大规模的数量和需要的性能,那么它可能是值得的一组中的所有值的让你做到这一点非常快:自然
cache = set(itertools.chain.from_iterable(CODES)))
,构建这将会很慢并且会使用内存,所以这不是一个好主意,除非你需要很多性能并且会进行很多会员检查。
您可以使用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。
+1,这是一个合理的方式来做到这一点 - 我不知道它如何比较性能。尽管你应该在'chain(*)'上使用'chain.from_iterable()'。 – 2013-02-27 23:51:35
@Lattyware我认为'any()'和我的方法都在做短路,所以对于大数据来说性能差异应该可以忽略不计。 – 2013-02-28 00:07:25
如果不是仅仅检查是否存在,我想获得第二个值?在这种情况下“reddelicious”? – 2013-02-28 00:02:18
在这种情况下,你正在使用错误的数据结构,使用'dict',然后只做'CODES [“apple”]'(如果它不在那里,就赶上'KeyError')。 – 2013-02-28 00:04:48
@ 9位只使用'dic = dict(CODES)',这将返回一个字典。然后'dic ['apple']'会导致''reddelicious''。 – 2013-02-28 00:10:19