【发布时间】:2017-09-23 14:25:14
【问题描述】:
给定目标 ('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
但这需要我遍历所有字符对,直到找到第一个实例。 有没有办法在不循环所有字符的情况下找到成对元素的索引?
在 cmets 中回答 @MatthiasFripp 的问题:
您的元素是在列表或类型中(如图所示)还是在生成器中(例如从文件句柄中读取)?
x* 都是字符串的元组。因此可以通过索引访问它们。但如果答案/解决方案适用于元组和生成器,那就太好了!
你能说一下你需要搜索多少个列表以及它们有多长吗?这将有助于建议搜索策略。
元组的长度不是固定的。它们的大小可以 > 2。
【问题讨论】:
-
if ab in "".join(x0) ?
-
“不循环所有元素”是什么意思?当然,您必须至少查看每个元素一次才能确定元组不在列表中。 (您可能会争辩说查看每个第二个元素就足够了,但是您必须将其与元组中的 both 元素进行比较,不是吗?)
-
@alvas 我认为即使您使用 dict 在恒定时间内访问一对也是不可能的。你仍然需要循环一次来构造。
-
你不需要 try-except 子句,
return next((i for i, pair in enumerate(pairwise(x)) if pair == target), None) -
@alvas 从概念上讲,您能否在问题中解释您希望如何在没有显式或隐式循环的情况下实现这一点?
标签: python indexing tuples pairwise