给定目标('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。