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