返回1-d数组缺少数据的索引的最佳方法是什么。缺失的数据由零表示。数据可能真的为零,但不会丢失。我们只希望一次返回数据为零的索引超过或等于3个位置。例如对于数组[1,2,3,4,0,1,2,3,0,0,0,1,2,3],该函数应仅返回第二段的索引,其中有零而不是第一段实例
这实际上是一个面试问题:)挑战是在一行中做得最有效
答案 0 :(得分:0)
跟踪当前运行中的零计数。然后,如果运行完成且至少有三个零,则计算索引。
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
是最小的零行数,计为缺失数据:< / p>
[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}})