在列表中确定连续重复的最奇怪的方法是什么?

我有一个整数列表,我希望能够识别连续的重复块:也就是说,我想产生一个保存顺序的列表,其中每个双重包含(int_in_question,发生次数)。

例如,如果我有一个像这样的列表:

[0, 0, 0, 3, 3, 2, 5, 2, 6, 6] 

我想要的结果是:

 [(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] 

我有一个相当简单的方法做一个for循环,温度和计数器:

 result_list = [] current = source_list[0] count = 0 for value in source_list: if value == current: count += 1 else: result_list.append((current, count)) current = value count = 1 result_list.append((current, count)) 

但我真的很喜欢python的函数式编程习惯用法,我想用一个简单的生成器expression式来做到这一点。 但是,我发现使用生成器时很难保持子计数。 我有一种感觉,两步骤的过程可能会让我在那里,但现在我被困住了。

有没有一个特别优雅/ pythonic的方式来做到这一点,尤其是与发电机?

 >>> from itertools import groupby >>> L = [0, 0, 0, 3, 3, 2, 5, 2, 6, 6] >>> grouped_L = [(k, sum(1 for i in g)) for k,g in groupby(L)] >>> # Or (k, len(list(g))), but that creates an intermediate list >>> grouped_L [(0, 3), (3, 2), (2, 1), (5, 1), (2, 1), (6, 2)] 

正如他们所说, 包括电池在内 。

build议使用JBernardo的sum和generatorexpression式; 见评论。