使用python查找缺少的数据索引

2024-03-29 10:48:26 发布

您现在位置:Python中文网/ 问答频道 /正文

在一维数组缺少数据的情况下,返回索引的最佳方法是什么。丢失的数据用零表示。数据可能真的为零,但不会丢失。我们只想返回一次超过或等于3个位置的数据为零的索引。例如,对于数组[1,2,3,4,0,1,2,3,0,0,0,1,2,3],函数应该只返回第二个有零的段的索引,而不是第一个实例。你知道吗

这实际上是一个面试问题:)挑战是在一行中做得最有效


Tags: 数据实例方法函数情况数组
1条回答
网友
1楼 · 发布于 2024-03-29 10:48:26

跟踪当前运行中的零计数。然后,如果一个至少有三个零的运行结束,则计算索引。你知道吗

def find_dx_of_missing(a):
    runsize = 3 # 3 or more, change to 4 if your need "more than 3"
    zcount = 0
    for i, n in enumerate(a):
        if n == 0:
            zcount += 1
        else:
            if zcount >= runsize:
                for j in range(i - zcount, i):
                    yield j
            zcount = 0
    if zcount >= runsize: # needed if sequence ends with missing
        i += 1
        for j in range(i - zcount, i):
            yield j

示例:

>>> a = [1,2,3,4,0,1,2,3,0,0,0,1,2,3]
>>> list(find_dx_of_missing(a))
[8, 9, 10]

>>> a = [0,0,0,3,0,5,0,0,0,0,10,0,0,0,0,0]
>>> list(find_dx_of_missing(a))
[0, 1, 2, 6, 7, 8, 9, 11, 12, 13, 14, 15]

编辑:由于您需要一行,这里有两个候选者,假设a是您的列表,n是计算为缺失数据的最小零行:

[v for vals in (list(vals) for iszeros, vals in itertools.groupby(xrange(len(a)), lambda dx, a=a: a[dx]==0) if iszeros) for v in vals if len(vals) >= n]

或者

sorted({dx for i in xrange(len(a)-n+1) for dx in xrange(i, i+n) if set(a[i:i+n]) == {0}})

相关问题 更多 >