У меня есть список 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
Благодарю.
Один из способов сделать это, используя 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