计算列表中元素的出现,直到出现另一个元素

时间:2020-03-11 03:30:23

标签: python

提供列表:

lst = [1,1,1,5,3,3,9,3,3,3,3,3]

我想对列表中每个项目的出现进行计数,例如,当3在{{1之间时,在这种情况下,数字3将被计数两次}}和5的计数为9,当23之后时,计数为9。结果列表应该是该项目,然后是其计数。

5

我已经尝试了以下代码,但是会得到扩展的答案。

result = [1,3,5,1,3,2,9,1,3,5]

2 个答案:

答案 0 :(得分:4)

itertools.groupby()对此很有用。它将按键对项目进行分组,并使用键(包含项目的分组器)返回和迭代器。您可以将古珀刀转换为列表并取其长度:

from itertools import groupby

lst = [1,1,1,5,3,3,9,3,3,3,3,3]

def counts(lst):
    for k, v in groupby(lst):
        yield k
        yield len(list(v))

list(counts(lst))
# [1, 3, 5, 1, 3, 2, 9, 1, 3, 5]

您也可以使用chain以单线方式进行此操作:

from itertools import groupby, chain

lst = [1,1,1,5,3,3,9,3,3,3,3,3]

list(chain.from_iterable((k, len(list(v))) for k, v in groupby(lst)))
# [1, 3, 5, 1, 3, 2, 9, 1, 3, 5]

如果由于某种原因想要以困难的方式执行此操作,则需要跟踪当前计数和正在计数的当前事物,并在该事物发生变化时追加:

lst = [1,1,1,5,3,3,9,3,3,3,3,3]

def makeCounts(lst):
    if len(lst) == 0: 
        return lst
    res = []
    # take first element
    cur = lst[0]
    count = 1

    for n in lst[1:]:
        if n == cur:
            # same item — increase count
            count += 1
        else:
            # new item — reset count and save previous
            res.extend([cur, count])
            count = 1
            cur = n

    # don't forget last item
    res.extend([cur, count])

    return res

makeCounts(lst)
# [1, 3, 5, 1, 3, 2, 9, 1, 3, 5]

答案 1 :(得分:0)

lst = [1, 1, 1, 5, 3, 3, 9, 3, 3, 3, 3, 3]
count = 0
result = []


def myfun(idx, arr):
    global count
    if idx < len(arr):
        if idx + 1 < len(arr) and (arr[idx + 1] - arr[idx]) == 0:
            count += 1
            myfun(idx + 1, arr)
        else:
            result.append(arr[idx])
            count += 1
            result.append(count)
            count = 0
            myfun(idx + 1, arr)


myfun(0, lst)
print(result)
#[1, 3, 5, 1, 3, 2, 9, 1, 3, 5]
相关问题