を行うことです。次に、少なくとも3つのゼロがある実行が終了した場合は、インデックスを計算します。
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]
編集:あなたはここで1つのライナーを必要とするので、2人の候補者が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}})
私のアルゴリズムは、ゼロがある各場所を見つけて、開始点と終了点を見つけて、それが2より大きいかどうかを調べ、それがなければ開始終了点を削除します。しかし、私が持っている非常に長い行のデータでは非常に効率が悪く、開始エンドポイントを保存する必要があります。より良い方法があると確信しています – Chaos
a = [1,2,3,4,1、 1,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0]、この配列に対しては正しい[11,12,13]を返しています3だけでなく、ゼロでないすべてのインデックスを返さなければなりません。 – Chaos
'[1,2,3,4,0,1,2,3,0,0,0,1,2,3]'はどのように3つ以上の連続するゼロがある場所はありませんか? –