按数字计算列表中数字重复的次数

Count how many times numbers repeat in list number by numbers

考虑第一个数字,比如 m。查看这个数字连续重复了多少次。如果它连续重复 k 次,它会在输出列表中产生两个条目:第一个 数 k,然后数 m。 (这类似于我们在看到时说“四个 2” [2,2,2,2].) 然后我们移动到 m 的 运行 之后的下一个数字。重复这个过程 直到列表中的每个数字都被考虑

示例:通过查看几个示例或许可以最好地理解该过程:

• readAloud([]) 应该 return []

• readAloud([1,1,1]) 应该 return [3,1] • readAloud([-1,2,7]) 应该 return [1,-1,1,2,1,7]

• readAloud([3,3,8,-10,-10,-10]) 应该 return [2,3,1,8,3,-10]

• readAloud([3,3,1,1,3,1,1]) 应该 return [2,3,2,1,1,3,2,1]

我有以下代码:

def readAloud(lst: List[int]) -> List[int]: 

    answer:List[int]=[]


    l=len(lst)
    d=1

    for i in range(l-1):

        if(lst[i]==lst[i]):
            d = d + 1
           

            answer.append(d)
            answer.append(lst[i])

        if (lst[i-1] != lst[i]):
             d=1
             answer.append(d)
             answer.append(lst[i])

    return answer

这里有一个解决方案(但这不是唯一的:))

def readAloud(lst):   
    answer = []
    count = 1
    prev_elt = lst[0]
    for m in lst[1:] + [None]: # we add Node for the last values
        if prev_elt == m:
            count += 1
        else:
            answer.extend([count, prev_elt])
            prev_elt = m
            count = 1
    return answer

print(readAloud([3,3,1,1,3,1,1]))

分组相邻元素正是 itertools.groupby 的用途。

from itertools import chain, groupby

def read_aloud(numbers):
    r = ((sum(1 for _ in v), k) for k, v in groupby(numbers))
    return list(chain.from_iterable(r))

示例:

>>> read_aloud([])
[]
>>> read_aloud([1, 1, 1])
[3, 1]
>>> read_aloud([3, 3, 8, -10, -10, -10])
[2, 3, 1, 8, 3, -10]
>>> read_aloud([3, 3, 1, 1, 3, 1, 1])
[2, 3, 2, 1, 1, 3, 2, 1]