Check if element exists in tuple of tuples
I have a list of tuples that look like :
CODES = (
('apple', 'reddelicious'),
('caramel', 'sweetsticky'),
('banana', 'yellowfruit'),
)
What's the best way to check if a value exists in that tuple? For example I want to be able to say:
'apple' in CODES
and get True
You are looking for any()
:
if any('apple' in code for code in CODES):
...
Combined with a simple generator expression, this does the task. The generator expression takes each tuple and yields True
if it is contains 'apple'
. any()
then returns True
when the first item it requests returns True
(otherwise, False
). Hence this does what you want. It also reads nicely - if any of the tuples contain 'apple'
.
If you are doing this a massive number of times and need performance, then it might be worth making a set of all of the values to allow you to do this very quickly:
cache = set(itertools.chain.from_iterable(CODES)))
Naturally, constructing this will be slow and use memory, so it wouldn't be a good idea unless you need a lot of performance and will be doing a lot of membership checks.
You can use itertools.chain()
:
Using it with in
will result in short-circuiting, similar to 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
For performance comparisons you can check my other answer.