循环中的计数器 /list/ 如果它们一个接一个地计算相同的值 (python)

counter in loop /list/ count same vale if they are one after another (python)

该程序的想法是计算某些结构的生命周期(计算一个接一个的相同结构)但我在实现计数器或枚举函数时遇到问题,我不想计算所有结构的数量。我试过很多方法。现在我卡住了。

struct=[1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,] #input list of structures
list1=[] #list of lifetimes for struct 1

for i in range (0, len(struct)-1):
    a=struct[i-1]
    b=struct[i]
    c=struct[i+1]
    if a!=1 and b==1 and c!=1: # if it is one separated record
        list1.append(1)
    if a!=1 and b==1 and c==1: # for first record in sequence 
        list1.append('f')
    if a==1 and b==1 and c==1: # for middle record in sequence
        list1.append('m')
    if a==1 and b==1 and c!=1: # for last record in sequence 
        list1.append('l')

print (list1)

它给我:[1, 1, 'f', 'm', 'm', 'l', 'f', 'l']
你能给我任何建议如何实施 counter 吗? 例如 ['f', 'm', 'm', 'l] (firs/middle/middle/last) 是从结构列表中的 [1, 1, 1, 1] 给出的,所以它是4条记录 得到 [1, 1, 4, 2]

抱歉,对于我的非编程语言,我是这个领域的初学者。 我搜索过任何类似的问题,但找不到。

您正在寻找这样的东西吗?

inlist = [1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,]
#         1                 1        1--2--3--4     1--2
def lifetime(num):
    output = []
    count = 0
    for x in inlist:
        if x == num:
            count += 1
        else:
            if count != 0:
                output.append(count)
                count = 0
    if count != 0:
        output.append(count)

    print output

lifetime(1)
lifetime(2)
lifetime(3)

输出:

[1, 1, 4, 2]
[3, 1, 1]
[2, 1]

您可以使用 itertools.groupby() 按值对列表进行分组,然后 return 每个组具有给定值的计数:

from itertools import groupby

def ilen(iterable):
    """ Return the length of an iterable """
    return sum(1 for _ in iterable)

def lifetime(num, lst):
    """ Return a list of counts for each group of num in lst """
    return [ilen(g) for k, g in groupby(lst) if k==1]

示例:

>>> inlist = [1, 2, 2, 2, 3, 3, 1, 2, 3, 1, 1, 1, 1, 2, 1, 1,]
>>> lifetime(1, inlist)
[1, 1, 4, 2]