Преобразуйте определенные числа, которые случайно распределены в списке, оставляя другие

1

У меня есть список z, пытающийся преобразовать все 1s в 0s только в том случае, если им предшествовало или сопровождалось 0. 2s и 4s действуют как разрывы в последовательности, а 1s, не привязанные к 0, должны оставаться 1s. Список y - это то, что я хотел бы иметь.

z=[2,1,2,0,1,1,1,2,1,1,2,1,1,1,0,2,0,1,4,1,0,0,1,1,2,0]
y=[2,1,2,0,0,0,0,2,1,1,2,0,0,0,0,2,0,0,4,0,0,0,0,0,2,0]

Я могу получить только все 1s, равные 0, включая те, которые не привязаны к 0.

for a in range(len(z)):
    if a==0: 
        startindex=0
    elif a==(len(z)-1):
        ctr+=1
        for i in range(startindex,(len(z))):
            if z[i]==1:
                f=1
                y.append(f)
            else:
                f=z[i]
                y.append(f)
    else:
        for i in range(startindex,a):
            if z[i]==0:
                f=0
                y.append(f)
            elif z[i]==1: 
                f=0
                y.append(f)
            else:
                f=z[i]
                ctr+=1
                y.append(f)
        startindex=a

Благодарю.

  • 0
    Добро пожаловать в StackOverflow. Пожалуйста, прочитайте и следуйте инструкциям публикации в справочной документации, как это было предложено при создании этой учетной записи. Минимальный, полный, проверяемый пример применим здесь. Мы не сможем эффективно помочь вам, пока вы не опубликуете свой код MCVE и точно не опишите проблему. Мы должны быть в состоянии вставить ваш опубликованный код в текстовый файл и воспроизвести проблему, которую вы описали.
  • 0
    Я пытался исправить ваши отступы, но у вас все еще есть пара неопределенных переменных. Однобуквенные имена переменных и отсутствие комментариев делают вашу предполагаемую логику неясной. Пожалуйста, помогите нам помочь вам.
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Один из способов сделать это, используя itertools.groupby. Идея состоит в том, что если в последовательности 0 и 1 есть нуль, все обращаются к 0, а остальные значения остаются неизменными:

from itertools import groupby

z = [2,1,2,0,1,1,1,2,1,1,2,1,1,1,0,2,0,1,4,1,0,0,1,1,2,0]

out = []
for zero_or_one, group in groupby(z, lambda x: x in {0, 1}):
    values = list(group)
    if zero_or_one:
        if any(x==0 for x in values):
            values = [0]*len(values)
    out.extend(values)


print(out)
# [2, 1, 2, 0, 0, 0, 0, 2, 1, 1, 2, 0, 0, 0, 0, 2, 0, 0, 4, 0, 0, 0, 0, 0, 2, 0]

y=[2,1,2,0,0,0,0,2,1,1,2,0,0,0,0,2,0,0,4,0,0,0,0,0,2,0]
assert out == y  # this is the expected output

Ещё вопросы

Сообщество Overcoder
Наверх
Меню