2016-04-21 53 views
3

給出一個列表:在列表中查找項目的連續數量?

>>> l = ['x', 'x', 'y', 'y', 'x'] 

我可以通過使用collections.Counter獲取列表的計數:

>>> from collections import Counter 
>>> Counter(l) 
Counter({'x': 3, 'y': 2}) 

我怎麼能算相鄰的項目,而不是在列表中元素的全球性計數?例如

>>> l = ['x', 'x', 'y', 'y', 'x'] 
>>> ContiguousCounter(l) 
[('x',2), ('y',2), ('x', 1)] 

>>> l = ['x', 'x', 'y', 'y', 'x', 'x', 'x', 'y'] 
>>> ContiguousCounter(l) 
[('x',2), ('y',2), ('x', 3), ('y', 1)] 

回答

8

你可以使用內置itertools.groupby功能:

In [3]: from itertools import groupby 

In [4]: l = ['x', 'x', 'y', 'y', 'x'] 

In [5]: list(groupby(l)) 
Out[5]: 
[('x', <itertools._grouper at 0x7fd94716f1d0>), 
('y', <itertools._grouper at 0x7fd94716f208>), 
('x', <itertools._grouper at 0x7fd94716f240>)] 

In [6]: [(x, len(list(g))) for x, g in groupby(l)] 
Out[6]: [('x', 2), ('y', 2), ('x', 1)]