我想要列表的智能打印。例如:
a=[2,2,2,1,1,1,1,1,1,1]
我希望打印结果如下:2*3, 1*7
不喜欢:2,2,2,1,1,1,1,1,1
答案 0 :(得分: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']
答案 1 :(得分: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'
答案 2 :(得分:1)
你想要简单的RLE(游程编码),你可以这样做
from itertools import groupby
return [(k, sum(1 for _ in g)) for k, g in groupby(a)]
你将得到一个元组列表,每个元组的第一项是原始数组中的数字,第二项是组长。