计数器在循环/列表/计数相同的值,如果它们是一个接一个(python)

时间:2015-01-20 23:27:26

标签: python loops counter

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

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'] 你能给我任何建议如何实施反击?  例如['f','m','m','l](第一/中/中/后)是从结构列表中的[1,1,1,1]给出的,因此它是4条记录 获得[1,1,4,2]

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

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

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

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]