在列表中查找交替数字序列

Finding a sequence of alternating numbers in a list

我目前正在尝试实施第四条纳尔逊法则: https://en.wikipedia.org/wiki/Nelson_rules

即给定一个长度为 N 的数字列表,我想知道是否存在在长度为 n 的方向上交替排列的连续数字序列。 'Alternating' 表示连续数字上升,然后下降,然后上升,依此类推

我的数据在 (t,x) 元组中。 't'代表时间轴,一直递增。 'x' 是与我们关注的时间和系列相关联的值。例如:

data = [(0, 2.5), (1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]

在这里,交替的 x 值序列适用于除第一个元组之外的所有内容。见下图:

交替序列以红色突出显示。该规则查找连续 14 个点,但我想将其概括为连续 n 个点。 (n < N) 不能只输出True或False,我要输出满足条件的点的元组。换句话说,输出将是:

outliers = [(1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]

我已经尝试了一些方法,none 结果得到了所需的输出。其中包括 np.diff() 和 np.sign() 之类的东西。我有一种感觉 itertools() 可以做到这一点,但我不能完全做到这一点。

非常感谢任何意见。

这是您算法的第一个切入点Python:

data = [(0, 2.5), (1, 2.1), (2, 1.7), (3, 2.0), (4, 0.3), (5, 0.8), (6, -1.2), (7, -0.5)]
n = 5

t0, x0 = data.pop(0)
outliers = []
up = bool(x0 > 0)

for t, x in data:
    if (x < x0 and up) or (x > x0 and not up):
        if not outliers:
            outliers = [(t0,x0)]
        outliers.append((t,x))
        up = not up
    else:
        if len(outliers) >= n:
            print 'outliers =', outliers
        outliers = []
    t0,x0 = t,x

if len(outliers) >= n:
    print 'outliers =', outliers