python长度为的事件的连续计数

python长度为的事件的连续计数,python,statistics,Python,Statistics,这可能真的很容易做到,但我希望用python计算列表中连续出现的正事件的长度。例如,我有a,我希望返回b: a=[0,0,1,1,1,1,0,0,1,0,1,1,1,0] b=[0,0,4,4,4,4,0,0,1,0,3,3,3,0] 我注意到关于的一个类似问题,但它只返回连续计数,而不返回所属组的长度 谢谢这类似于一个问题,因此我从Rosetta代码页借用了一些想法: import itertools a=[0,0,1,1,1,1,0,0,1,0,1,1,1,0] b = [] for

这可能真的很容易做到,但我希望用python计算列表中连续出现的正事件的长度。例如,我有a,我希望返回b:

a=[0,0,1,1,1,1,0,0,1,0,1,1,1,0]

b=[0,0,4,4,4,4,0,0,1,0,3,3,3,0]
我注意到关于的一个类似问题,但它只返回连续计数,而不返回所属组的长度

谢谢

这类似于一个问题,因此我从Rosetta代码页借用了一些想法:

import itertools
a=[0,0,1,1,1,1,0,0,1,0,1,1,1,0]

b = []
for item, group in itertools.groupby(a):
    size = len(list(group))
    for i in range(size):
        if item == 0:
            b.append(0)
        else:
            b.append(size)

b
Out[8]: [0, 0, 4, 4, 4, 4, 0, 0, 1, 0, 3, 3, 3, 0]
这里有一种方法

基本前提是,当连续运行正值时,它将记住这些正值的所有指数。一旦它达到零,它将回溯并用其运行长度替换所有正值

a=[0,0,1,1,1,1,0,0,1,0,1,1,1,0]

glob = []
last = None
for idx, i in enumerate(a):
    if i>0:
        glob.append(idx)
    if i==0 and last != i:
        for j in glob:
            a[j] = len(glob)
        glob = []

# > [0, 0, 4, 4, 4, 4, 0, 0, 1, 0, 3, 3, 3, 0]

经过多次尝试,终于想出了这两行

In [9]: from itertools import groupby

In [10]: lst=[list(g) for k,g in groupby(a)]

In [21]: [x*len(_lst) if x>=0 else x for _lst in lst for x in _lst]
Out[21]: [0, 0, 4, 4, 4, 4, 0, 0, 1, 0, 3, 3, 3, 0]

如果可能的话,更愿意使用一个简单的循环,但是可以接受建议。计算速度也很重要。