Given the target ('b', 'a')
and the inputs:
x0 = ('b', 'a', 'z', 'z')
x1 = ('b', 'a', 'z', 'z')
x2 = ('z', 'z', 'a', 'a')
x3 = ('z', 'b', 'a', 'a')
The aim is to find the location of the continuous ('b', 'a')
element and get the output:
>>> find_ba(x0)
0
>>> find_ba(x1)
0
>>> find_ba(x2)
None
>>> find_ba(x3)
1
Using the pairwise
recipe:
from itertools import tee
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return zip(a, b)
I could do this to get the desired output:
def find_ba(x, target=('b', 'a')):
try:
return next(i for i, pair in enumerate(pairwise(x)) if pair == target)
except StopIteration:
return None
But that would require me to loop through all pairs of characters till I find the first instance. Is there a way to find index of pairwise elements without looping all the characters?
Answering @MatthiasFripp's question in the comments:
Are your elements in lists or types (as shown) or in a generator (e.g. reading from a file handle)?
The x* are all tuples of strings. So they can be access through the index. But if the answer/solution can work for tuples and generator, that'll be great!
Can you say about how many lists you have to search and about how long they are? That would help for suggesting a search strategy.
The lengths of the tuples are not fixed. They can be of size > 2.