Suppose you have a sequence of 2-tuples:
seq_of_tups = (('a', 1), ('b', 2), ('c', 3))
and you want to test if 'a'
is the first item of any tuple in the sequence.
What is the most Pythonic way?
Convert to a dictionary and test for keys, which seems easy enough to understand? i.e.
'a' in dict(seq_of_tups)
Use a cute zip trick which is is not particularly clear unless you know the trick? i.e.
'a' in zip(*seq_of_tups)[0]
Or be really explicit with map? i.e.
'a' in map(lambda tup: tup[0], seq_of_tups)
Or is there a better way than any of these choices?
>>> seq_of_tups = (('a', 1), ('b', 2), ('c', 3))
>>> any(x == 'a' for x, y in seq_of_tups)
True
For tuples of any size you could use this instead:
any(x[0] == 'a' for x in seq_of_tups)
Also here are some interesting timings:
>python -m timeit -s "seq_of_tups = (('a', 1), ('b', 2), ('c', 3))"
"any(x == 'a' for x, y in seq_of_tups)"
1000000 loops, best of 3: 0.564 usec per loop
>python -m timeit -s "seq_of_tups = (('a', 1), ('b', 2), ('c', 3))"
"'a' in (x[0] for x in seq_of_tups)"
1000000 loops, best of 3: 0.526 usec per loop
>python -m timeit -s "seq_of_tups = (('a', 1), ('b', 2), ('c', 3));
from operator import itemgetter; from itertools import imap"
"'a' in imap(itemgetter(0), seq_of_tups)"
1000000 loops, best of 3: 0.343 usec per loop
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With