0

我想要一个智能打印列表。例如:

a=[2,2,2,1,1,1,1,1,1,1]

我想要这样的打印结果:2*3, 1*7

不喜欢:2,2,2,1,1,1,1,1,1

4

3 回答 3

11
>>> a = [2,2,2,1,1,1,1,1,1,1]    
>>> from itertools import groupby
>>> ["{}*{}".format(k, sum(1 for x in g)) for k, g in groupby(a)]
['2*3', '1*7']

或者为了代码重用:

>>> def rle(seq):
...     return ((k, sum(1 for x in g)) for k, g in groupby(seq))
... 
>>> ["{}*{}".format(*x) for x in rle(a)]
['2*3', '1*7']
于 2013-08-22T06:55:34.897 回答
4

collections.Counter如果订单无关紧要,您可以使用:

>>> from collections import Counter
>>> a = [2,2,2,1,1,1,1,1,1,1]
>>> ",".join(("%s*%s" % (item, count) for item, count in Counter(a).iteritems()))
'1*7,2*3'
于 2013-08-22T06:54:26.607 回答
1

你想要简单的 RLE(运行长度编码),你可以这样做

from itertools import groupby
return [(k, sum(1 for _ in g)) for k, g in groupby(a)]

您将获得一个元组列表,每个元组的第一项是原始数组中的数字,第二项是组长度。

于 2013-08-22T06:59:05.673 回答