2015-07-08 1 views
2

Имея список (без повторных значений):Заполнение массива с отсутствующими contigous номера и получить индекс

[67000, 67002, 67003, 67004, 67005, 67006, 67009] 

Я хочу, чтобы заполнить список с contigous номерами, которые отсутствуют на нем, так что мой желаемый результат будет:

[67000, 67001, 67002, 67003, 67004, 67005, 67006, 67007, 67008, 67009] 

А также получить индекс элементов, которые были добавлены в список:

indx_list = [1,7,8] 

Это моя попытка:

lista_num = [67000, 67002, 67003, 67004, 67005, 67006, 67009] 
for i in xrange(len(lista_num)-1): 
    if lista_num[i] != lista_num[i+1]-1: 
     print lista_num[i] 
     lista_n = lista_num[i] 
     lista_nu = lista_num[i+1] 

     while lista_n < lista_nu-1: 
      lista_n = lista_n + 1 
      lista_num.insert(i+1, lista_n) 
    else: 
     print "ok" 

Но я получаю следующий результат, который не желаемый результат. Я думаю, что я возился с индексами.

[67000, 67001, 67002, 67003, 67004, 67005, 67006, 67009] 

Я не пробовал часть получения индекса элементов, как это первый шаг получения списка contigous номер даже не работает.

Как я могу исправить свой код и архивировать свою цель? Заранее спасибо.

+0

Почему downvote? Я объяснил свою проблему, мой желаемый результат, а также мою попытку. –

+0

Если списки всегда сортируются, то min будет 'lst [0]' и max 'lst [-1]' –

ответ

3

Предположим, что ваш первоначальный список является

a = [67000, 67002, 67003, 67004, 67005, 67006, 67009] 

Таким образом, ваш требуемый целевой список может быть найден с

out = range(min(a), max(a) + 1) 

и добавленные индексы могут быть найдены с

[i for (i, v) in enumerate(out) if v not in a] 

(Сложность последней строки квадратично, чтобы уменьшить ее до линейной, вы можете сделать

sa = set(a) 
[i for (i, v) in enumerate(out) if v not in sa] 

.)

+0

Использование 'range (min (a), max (a))' последнее значение списка, ' 67009' игнорируется. Как я могу это исправить? Например, добавление 'max (a) + 1' работает. Но где же логика после этого? Я имею в виду, что 'max (a)' равно 67009, так почему он игнорируется? –

+1

@Borja, потому что диапазоны только наполовину открыты –

+1

@Borja спасибо, не заметил этого; обновил ответ. Python 'range' является эксклюзивным. Чтобы иметь что-то до 'end' включительно, вам нужно иметь' end + 'в вызове' range'. –

1

У вас есть 2 проблемы в вашем коде, первое это диапазон, если ваш главный for цикла, вам нужна петля на len(lista_num) и вам не нужно -1, второй является то, что вам нужно увеличить i в пределах while цикла:

lista_num = [67000, 67002, 67003, 67004, 67005, 67006, 67009] 
for i in xrange(len(lista_num)): 
    if lista_num[i] != lista_num[i+1]-1: 
     lista_n = lista_num[i] 
     lista_nu = lista_num[i+1] 

     while lista_n < lista_nu-1: 
      lista_n = lista_n + 1 
      lista_num.insert(i+1, lista_n) 
      i=i+1 

print lista_num 

результат:

[67000, 67001, 67002, 67003, 67004, 67005, 67006, 67007, 67008, 67009] 

Но как более вещий образом, вы можете использовать itertools модуль:

from itertools import izip,chain 
lista_num = [67000, 67002, 67003, 67004, 67005, 67006, 67009] 
lista_num.append(lista_num[-1]+1) 
print list(chain.from_iterable(xrange(i,j) for i,j in izip(lista_num,lista_num[1:]))) 
[67000, 67001, 67002, 67003, 67004, 67005, 67006, 67007, 67008, 67009] 
0

Ваш список отображается для сортировки, поэтому по определению первая запись является наименьшим, и последним величайшая избежать необходимости, чтобы найти их.Если это всегда так, просто создать новый список следующим образом:

lista_num = [67000, 67002, 67003, 67004, 67005, 67006, 67009] 
listb_num = range(lista_num[0], lista_num[-1]+1) 

Чтобы определить, какие элементы были добавлены вы можете сделать следующее:

missing_items_set = set(listb_num).difference(set(lista_num)) 
print missing_items_set 

set([67008, 67001, 67007]) 

Это может быть преобразован в список и сортируются :

missing_items_list = list(missing_items_set) 
missing_items_list.sort() 
print missing_items_list 

[67001, 67007, 67008] 

Если lista_num[0] вычитали из каждого, что даст вам индексы.

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