python计算列表中的项目并保持它们的发生顺序

时间:2011-10-26 12:58:53

标签: python

鉴于:列表,例如l = [4,4,4,4,5,5,5,6,7,7,7] Todo:得到一个元素的计数并保持它们的出现顺序,例如: [(4,4),(5,3),(6,1),(7,3)]

我可以用:

tmpL    = [(i,l.count(i)) for i in l]
tmpS    = set()
cntList = [x for x in tmpL if x not in tmpS and not tmpS.add(x)]

但是有更好的方法吗?我已经看到了链接here,但它对计数进行排序,从而打破了顺序。

编辑:性能不是解决方案的问题,最好是内置的。

3 个答案:

答案 0 :(得分:9)

使用groupby

>>> l = [4,4,4,4,5,5,5,6,7,7,7,2,2]
>>> from itertools import groupby
>>> [(i, l.count(i)) for i,_ in groupby(l)]
[(4, 4), (5, 3), (6, 1), (7, 3), (2, 2)]

答案 1 :(得分:7)

>>> import itertools
>>> [(k, len(list(g))) for k, g in itertools.groupby(l)]
[(4, 4), (5, 3), (6, 1), (7, 3)]

这样可以保持项目的顺序,也可以重复项目:

>>> l=[4,4,4,4,5,5,5,6,7,7,7,4,4,4,4,4]
>>> [(k, len(list(g))) for k, g in itertools.groupby(l)]
[(4, 4), (5, 3), (6, 1), (7, 3), (4, 5)]

答案 2 :(得分:2)

如果您使用的是Python 2.7,则可以使用集合中的Counter,它完全符合您的要求:

http://docs.python.org/library/collections.html#collections.Counter