2016-11-30 5 views
0

Не могли бы вы помочь мне в этой проблеме? У меня есть массив, как этотПропуск элемента в списке

a = [1,2,3,0,0,0,3,4,5] 

и я хочу выход быть

a = [1,2,3,0,0,0,4,5,6] 

или a = [1,2,3,0,3,4,5] -> a = [1,2,3,0,4,5,6]

Так, я знаю, как обнаружить дубликаты и увеличить число в списке. Но моя проблема в том, как я могу определить 0 и «пропустить» ее в своей итерации по списку? Любая помощь приветствуется (Python 2.7 идеально подходит, так как мы используем 2.7)

мой путь до сих пор

i = 1 
while i < len(a): 
    if a[i-1] == a[i]: 
     a[i] = a[i]+1 
i = i+1 

и, очевидно, это работает только в том случае a = [1,2,3,3,4,5]

Спасибо за ваше время.

+0

Что вы пробовали? – Akavall

+3

Вы не предоставили достаточную информацию об алгоритме, вы увеличиваете значение на основе '0', например. делает '[1,2,0,3,4]' становиться '[1,2,0,4,5]' или увеличивает его из-за дубликата '3' (игнорируя' 0 's), например. '[1,2,3,3,4]' становится '[1,2,3,4,5]'. И вы не показали никаких попыток с вашей стороны. – AChampion

+0

нет, этого достаточно. Поскольку у меня есть только случаи [1,2,3,0,4,5] или [1,2,3,0,0,4,5]. И в моей среде это будет «всегда». – Alexander

ответ

2
  • определяют вспомогательный набор для тестирования, если уже используется элемент
  • особый случай: если 0, не сквозная
  • сканировать исходный список, и увеличение на 1, пока не Окс установить
  • добавить новое значение в набор
  • добавляемого к списку выходного

(Нет список понимания здесь, так как есть побочный эффект)

мое предложение:

a = [1,2,3,0,0,0,3,4,5] 
b = [] 
s = set() 

for i in a: 
    if i: 
     while i in s: 
      i+=1 
     s.add(i) 
    b.append(i) 

Примечание: в зависимости от данных, то set может быть излишним. Если у вас есть только части данных увеличивается (за исключением нулевой) слот для карт памяти 1 должно быть достаточно:

a = [1,2,3,0,0,0,3,4,5] 
b = [] 

highest = 0 
for i in a: 
    if i!=0: 
     if i <= highest: 
      i=highest+1 
     highest = i 
    b.append(i) 

(что быстрее, потому что это не приводит к увеличению i, просто принимает наибольшее значение + 1)

+0

это работает. Я использовал итерацию в списке и сравнивал [i-1] и [i], а затем установил [i] = a [i] +1. Этот способ обнаруживает только дубликат, но не пропускает 0. Спасибо за помощь. – Alexander

+0

, если части списка отсортированы в порядке возрастания, за исключением нулей, вы можете упростить его, запомнив последний ненулевой элемент (нет необходимости в 'set') –

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