python计算列表中的项目并保持其出现顺序

luk*_*mac 4 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)]
Run Code Online (Sandbox Code Playgroud)

但有更好的方法吗?我在这里看到了这个链接,但它对计数进行了排序,因此打破了顺序.

编辑:性能不是解决方案的问题,更可取的是内置的东西.

jro*_*jro 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)]
Run Code Online (Sandbox Code Playgroud)

  • @lukmac 不要这样做。`count` 取决于整个列表的大小,而不仅仅是组的大小。使用 Tim 的方法或相同的一般思想与 `k, sum(1 for _ in g)` 而不是 `k, len(list(g))`。 (2认同)

Tim*_*ker 8

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

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

>>> 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)]
Run Code Online (Sandbox Code Playgroud)