一个基本的方法是计算我们在一行中看到的目标值,并在我们获得预期值的确切数量时保留索引:
def find_nth(data, target, n):
out = []
targets_in_a_row = 0
for index, value in enumerate(data):
if value != target:
targets_in_a_row = 0
else:
targets_in_a_row += 1
if targets_in_a_row == n:
out.append(index)
return out
data = ['y', 'x', 'y', 'x', 'x', 'x', 'x', 'y', 'x', 'x', 'x']
print(find_nth(data, 'x', 3))
# [5, 10]
另一种方法(很容易适应更复杂的模式但在这种情况下效率较低)是使用最大长度为n 的collection.deque 来保留我们看到的最后一个n 值。然后我们可以很容易地检查它们是否都等于目标。
我们只需要一个标志 (matched),一旦我们连续有 n 目标值就设置它,并且只有在我们得到不同的目标值时才会重置。
from collections import deque
def find_nth(data, target, n):
d = deque(maxlen = n)
out = []
matched = False
for index, value in enumerate(data):
d.append(value)
if value != target:
matched = False
elif not matched and all(val == target for val in d):
out.append(index)
matched = True
return out
data = ['y', 'x', 'y', 'x', 'x', 'x', 'x', 'y', 'x', 'x', 'x']
print(find_nth(data, 'x', 3))
# [5, 10]