我有一个看起来像的元组列表:
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
检查该元组中是否存在值的最佳方法是什么?例如,我希望能够说:
'apple' in CODES
并得到真
您正在寻找any()
:
if any('apple' in code for code in CODES):
...
结合一个简单的生成器表达式,这可以完成任务。生成器表达式接受每个元组,True
如果它是 contains 则产生'apple'
。any()
然后True
在它请求的第一个项目返回时返回True
(否则,False
)。因此,这可以满足您的需求。它也很好读 -如果任何元组包含'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
对于性能比较,您可以查看我的其他答案。