首页 > 解决方案 > 使用 itertools.groupby() 对重复列表对象进行分组

问题描述

我有一个列表,我想将重复的对象分组到新列表中的单个对象中。基本上,转换这个:

s = ['0.352125', '1', '1', '1', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0.241041', '0.313429', '1', '1']

对此: s_new = ['0.352125', '4*1','8*0', '0.241041', '0.313429','2*1']

我尝试过itertools.groupby()如下功能(python 2.7):

from itertools import groupby
s_g = [list(g) for k, g in groupby(s)]
s_new = [', '.join('{}*{}'.format(sum(1 for _ in g), k) for k, g in groupby(s_g))]

结果,我得到:

s_new = ["1*['0.352125'], 1*['1', '1', '1', '1'], 1*['0', '0', '0', '0', '0', '0', '0', '0'], 1*['0.241041'], 1*['0.313429'], 1*['1', '1']"]

显然,这不是我想要得到的列表格式。有人可以帮我吗?

标签: python-2.7

解决方案


您不必要地申请groupby了两次,也没有理由使用str.join.

您可以改用以下列表推导:

['%s*' % len(l) * (len(l) > 1) + k for k, g in groupby(s) for l in (list(g),)]

推荐阅读