首页 > 解决方案 > 如何按顺序获取数字的起点并处理错误情况?

问题描述

让我从一个例子开始,

array([  1,   6,  12,  14,  16,  18,  21,  23,  24,  27,  29,  54,  55,
        56,  57,  58,  59,  60,  61,  63,  64,  65,  66,  67,  68,  69,
        70,  71,  72,  74,  75,  76,  77,  78,  79,  81,  82,  83,  84,
        85,  86,  87,  88,  89,  90,  91,  92,  93,  94,  95,  96,  97,
        98,  99, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111,
       112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124,
       125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 138,
       139, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152,
       153, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166,
       167, 168, 169, 170, 171, 172, 173, 174, 175, 177, 178])

理想输出:54 (前进),175 (后退)

满足条件:

我需要从其顺序中找到第一个数字,最多为 5 位,例如:从 54 开始,数字按顺序排列(即 54、55、56、57、58)(5 位)。

我需要从第 175 点开始按相反的顺序(即 175、174、173、172、171)(5 位数)按顺序排列。

在某些情况下,我需要一个变量来分配可接受的错误。

例如,假设error_accepted = 1and error_difference(upto) = 1,那么如果值为 54、56、57、58、59,则可以接受。输出仍然是 54。否则,如果 error_accepted = 2 and error_difference (upto) = 3,则如果值为 54、58、59、61、62,也可以接受。输出仍然是 54。

我试图做一些事情,逻辑不正确,所以请原谅我写的代码。

# excuse the code, the logic ain't correct. 
start_ix_cnt = 0
start_ix_indices = None

counter_start = 0
counter = 0

for ix in matching_indexes:
    if start_ix_indices is None and start_ix_cnt == 0:
        start_ix_indices = list(range(1, 178))
        start_ix_cnt += 1
    else:
        if ix == start_ix_indices[start_ix_cnt]:
            counter += 1
            counter_start = start_ix_indices[0]
        else:
            start_ix_indices = list(range(ix, 178))
            start_ix_cnt = 0

任何帮助表示赞赏。

标签: python

解决方案


为了满足容错,我维护了一个命中和未命中的旋转缓冲区,并检查了我们有多少。为简单起见,这只是编码为遍历数组中所有值的直线。

def findFLseq(values, diff, sqlen, errtol, errqy):
    difflen = sqlen-1
    startseq = None
    endseq = None
    prev = -(diff+errtol+1)
    seqstate = -1 # => prev not valid
    errbuf = [sqlen]*difflen
    for i, val in enumerate(values):
        adjdiff = val - prev - diff
        if adjdiff == 0:
            seqstate += 1
            errtag = 0
        elif abs(adjdiff) <= errtol:
            seqstate += 1
            errtag = 1
        else:
            seqstate = 0
            errtag = sqlen
        errbuf[i%difflen] = errtag
        if seqstate >= difflen and sum(errbuf) <= errqy:
            endseq = i
            if startseq == None:
                startseq = i-difflen
        prev = val
    
    if startseq == None:
        return (None,None)
    else:
        return (values[startseq], values[endseq])

推荐阅读