考虑目标('b', 'a')
和输入:
x0 = ('b', 'a', 'z', 'z')
x1 = ('b', 'a', 'z', 'z')
x2 = ('z', 'z', 'a', 'a')
x3 = ('z', 'b', 'a', 'a')
旨在查找连续的('b', 'a')
元素的位置并获取输出:
>>> find_ba(x0)
0
>>> find_ba(x1)
0
>>> find_ba(x2)
None
>>> find_ba(x3)
1
使用“pairwise”配方:
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)
我可以这样做来获得所需的输出:
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
但这需要我遍历所有字符对,直到找到第一个实例。有没有一种方法可以找到成对元素的索引而不必遍历所有字符?回答@MatthiasFripp在评论中的问题:x*都是字符串元组列表。因此它们可以通过索引访问。但如果答案/解决方案适用于元组和生成器,那就太好了!你能说出你要搜索多少个列表以及它们有多长吗?这将有助于建议搜索策略。元组的长度并不固定。它们可以是大小> 2的元组。
return next((i for i, pair in enumerate(pairwise(x)) if pair == target), None)
。 - Chris_Rands