检查元素是否在元组的元组中存在
我有一个包含元组的列表,长得像这样:
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
我想知道检查一个值是否在这个元组里最好的方法是什么?比如我想能这样说:
'apple' in CODES
然后得到 True。
2 个回答
9
你可以使用 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
如果你想了解 性能比较,可以看看我在这里的 其他回答。
60
你可以看看 any()
这个函数:
if any('apple' in code for code in CODES):
...
结合一个简单的 生成器表达式,就能完成这个任务。这个生成器表达式会检查每个元组,如果里面有 'apple'
,就返回 True
。然后 any()
会在它请求的第一个项目返回 True
时就返回 True
(如果没有找到,就返回 False
)。所以这样就能实现你想要的效果。而且读起来也很顺畅——如果任何一个元组包含 'apple'
。
如果你要做这个操作很多次,并且对性能有要求,那么可以考虑先把所有的值放到一个集合里,这样可以很快地进行检查:
cache = set(itertools.chain.from_iterable(CODES)))
当然,构建这个集合会比较慢,并且会占用内存,所以如果你不需要很高的性能或者不需要做很多的成员检查,那就不太划算。