Вы можете использовать два понимания списка, чтобы собрать расстояния, проходящие вперед и назад по списку:
s = [0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]
forward = [s[i:].index(1) if x!=1 else 0 for i, x in enumerate(s)]
s_r = s[::-1]
backward = [s_r[i:].index(1) if 1 in s_r[i:] else 0 if x==1 else float('inf') for i, x in enumerate(s_r)][::-1]
Затем вы можете сжать два результирующих списка вместе и взять минимальное расстояние для каждого индекса:
final = [min(i,j) for i, j in zip(forward, backward)]
Выход:
[3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]