2016-07-28 1 views
0

У меня есть метод, который перебирает список номеров, и идентифицирует для последовательностей 0, отличный от нуля, а затем-«нормализует» значения Inbetween до 0.Python список понимание для идентификации и модификации последовательности

Вот мой код:

for index in range(len(array)-2): 
    if array[index] == 0 and array[index + 1] != 0 and array[index + 2] == 0: 
     array[index + 1] = 0 

Это в настоящее время работает нормально, и у меня есть дополнительные методы обнаружения последовательностей из 0, пг, пг, 0 и т.д.

Я искал в списковых в Python , но с трудом выясняя, с чего начать с этого конкретного как таковые. Можно ли это сделать, используя понимание списка?

+0

когда вы говорите 'normalize', вы имеете в виду установить значение равным нулю? – Psidom

+0

Итак, значение между двумя нулями становится равным нулю? –

+0

да это правильный. – ugotchi

ответ

2

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

2

Вы можете попробовать что-то вроде

new_array = [ 0 if (array[i-1] == array[i+1] == 0) 
       else array[i] 
       for i in range(1,len(array)-1) ] 

# More readable, but far less efficient 
array = array[0] + new_array + array[-1] 

# More efficient, but less readable 
# array[1:-1] = new_array 

Я настроил диапазон вы перебора, чтобы добавить некоторую симметрию условия, и воспользоваться тем, что вы на самом деле не нужно, чтобы проверить значение от array[i]; если это 0, нет никакого вреда в явной установке нового значения в 0.

Тем не менее, это не так ясно, как ваш исходный цикл, и излишне создает совершенно новый список, а не изменять исходный список только там, где это необходимо.

+1

Разве это не рубит первый и последний элементы? Возможно, назначение slice для исправления: 'array [1: -1] = ...' –

+0

Согласен, это выглядит намного сложнее, чем мой исходный код. Я надеялся на что-то более элегантное и эффективное, так как у меня есть около 6 из этих типов методов, которые ищут непрерывные шаблоны в моих данных списка временных рядов. – ugotchi

+0

Yup, забыл обработать кромки. Я исправлю. – chepner

-2

Не все должно быть постижением. Если вы хотите быть мучительным, хотя:

def f(a): 
    [a.__setitem__(i + 1, 0) for i, (x, y, z) in enumerate(zip(a, a[1:], a[2:])) 
    if x == z == 0 and y != 0] 

Тогда

>>> a = [1, 2, 0, 1, 0, 4] 
>>> f(a) 
>>> a 
[1, 2, 0, 0, 0, 4] 

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

  • Нет связанных вопросов^_^