根据另一个列表返回连续出现的列表



我有一个包含以下数字的列表:

[0, 0, 0, 0, 1, 1, 0, 0, 1]

我想要做的是计算我有多少个连续的1,并生成一个新的列表,如下所示:

[0, 0, 0, 0, 1, 2, 0, 0, 1]

是否有一种比这种方法更紧凑的方法?

lst = [0, 0, 0, 0, 1, 1, 0, 0, 1]
new_lst = []
counter = 0
for i in range(len(lst)):
if (lst[i] == 1): counter+=1
else:counter = 0
new_lst.append(counter)
print(new_lst)

如果使用python 3.8或更高版本,可以利用walrus操作符:

[counter := counter + 1 if v else 0 for v in lst]

或者itertools.accumulate:

[v for v in itertools.accumulate(lst, lambda acc, v:acc + v if v else 0)]

两种情况的结果都是:

[0, 0, 0, 0, 1, 2, 0, 0, 1]

它没有问题的解决方案那么紧凑,但它更清楚:

l = [0, 0, 0, 0, 1, 1, 0, 0, 1]
s = []
occ = 0
for i in l:
occ = occ+1 if i==1 else 0
s.append(occ)
print(s)

输出:

[0, 0, 0, 0, 1, 2, 0, 0, 1]