我有一个类似于:
的元组列表CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
检查该元组中是否存在值的最佳方法是什么?例如,我希望能够说:
'apple' in CODES
并获得True
答案 0 :(得分:49)
您正在寻找any()
:
if any('apple' in code for code in CODES):
...
结合简单的generator expression,这就完成了任务。生成器表达式获取每个元组,如果它包含True
,则生成'apple'
。 any()
然后在请求的第一个项目返回True
时返回True
(否则为False
)。因此,这就做你想要的。如果任何元组包含'apple'
,它也可以很好地读取 - 。
如果你这么做很多次并需要性能,那么可能需要制作一组所有值来让你很快完成这项工作:
cache = set(itertools.chain.from_iterable(CODES)))
当然,构建它会很慢并且使用内存,所以除非你需要大量的性能并且会进行大量的成员检查,否则这不是一个好主意。
答案 1 :(得分: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。