2016-10-18 3 views
-3

Каков оптимальный способ возврата индексов, где 1-й массив имеет отсутствующие данные. Отсутствующие данные представлены нулями. Данные могут быть действительно нулевыми, но не пропавшими без вести. Мы хотим вернуть индексы, где данные равны нулю для более чем или равно 3 местам за раз. Например, для массива [1,2,3,4,0,1,2,3,0,0,0,1,2,3] функция должна возвращать только индексы для второго сегмента, где есть нули, а не первые пример.Поиск недостающих индексов данных с использованием python

Это на самом деле вопрос интервью :) Задача состоит в том, чтобы сделать наиболее effeciently в одной строке

+0

Мой алгоритм проходит и находит каждое место, где есть нули, затем находит начальную и конечную точку, а затем видит, если он больше 2, если это не так, что удаляется конечная конечная точка начала. Но это очень неэффективно для очень длинного ряда данных, которые у меня есть, и я должен хранить начальные конечные конечные точки, я уверен, что есть лучший способ сделать это. – Chaos

+0

a = [1,2,3,4,1, 1,0,0,1,1,1,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] 'соответствовать чему-либо как нет нигде, что имеет более трех последовательных нулей? –

ответ

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] 

Edit: Поскольку вам нужен один лайнер здесь два кандидата, предполагающие 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

Привет, ваш ответ правильный, но я уверен, что должен быть способ сделать это более эффективно, может быть, в одной строке. – Chaos

+1

@Chaos: Я не уверен, что сделать его одним лайнером делает его более эффективным, но вот один liner: 'sorted ({dx for i in xrange (len (a) -3) для dx в xrange (i, i + 3), если a [i: i + 3] == [0,0,0]}) '. Я создаю промежуточный набор и сортирую его, чтобы избавиться от перекрывающихся прогонов из трех нулей. (Кроме того, могу я пойти на собеседование?) –

Смежные вопросы