2016-10-18 5 views
-3

1-d配列にデータがない場合にインデックスを返す最適な方法は何ですか?失われたデータはゼロで表されます。データは真にゼロかもしれないが、欠落していないかもしれない。一度に3つ以上の場所でデータがゼロのインデックスのみを返したいとします。たとえば、配列[1,2,3,4,0,1,2,3,0,0,0,1,2,3]の場合、関数は最初のセグメントではなく0である2番目のセグメントのインデックスのみを返しますインスタンス。Pythonを使用して欠落しているデータインデックスを見つける

これは実際に面接の質問です:)課題は、現在の実行中のゼロの数を追跡します1行で最もeffeciently

+0

私のアルゴリズムは、ゼロがある各場所を見つけて、開始点と終了点を見つけて、それが2より大きいかどうかを調べ、それがなければ開始終了点を削除します。しかし、私が持っている非常に長い行のデータでは非常に効率が悪く、開始エンドポイントを保存する必要があります。より良い方法があると確信しています – Chaos

+0

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

+0

'[1,2,3,4,0,1,2,3,0,0,0,1,2,3]'はどのように3つ以上の連続するゼロがある場所はありませんか? –

答えて

0

を行うことです。次に、少なくとも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}}) 
+1

Downvoters、何が私の答えに間違っていますか? –

+0

こんにちは、あなたの答えは正しいですが、私はこれをもっと効率的に、たぶん1行にする方法がなければならないと確信しています – Chaos

+1

@カオス:それを1本のライナーにすると効率が良くなりますが、 1つのライナー:[i:i + 3] == [0,0,0]}の場合、xrange(i、i + 3)のdxに対して{xrange(len ) '。私は中間セットを作成し、それをソートして、3つのゼロの重複したランを取り除きます。 (また、あなたの仕事のインタビューに行くことができますか?) –

関連する問題