如何在Python列表中分组连续或重复元素?
问题:将列表按连续/重复元素分组
给定Python列表:
data = [1, 2, 2, 2, 3, 4, 7, 8]
需要将连续或重复的元素归为同一组,预期分组结果为 [1, 2, 2, 2, 3, 4] 和 [7, 8]。尝试使用itertools.groupby但未得到预期结果,代码如下:
from itertools import groupby from operator import itemgetter for k, g in groupby(enumerate(data), lambda ix: ix[1] - ix[0] <=1): print(list(map(itemgetter(1), g)))
问题分析
你当前的判断逻辑ix[1] - ix[0] <=1并不符合分组需求:这个条件是判断元素值与索引的差值是否小于等于1,对于示例中的7(索引6),7-6=1同样满足条件,导致所有元素被归为同一组,无法区分4和7之间的分界。
解决方案
方法1:使用itertools.groupby配合分组键
通过生成分组标识键,让同一组内的元素拥有相同的键,分界处键值递增,从而实现正确分组:
from itertools import groupby, accumulate import operator data = [1, 2, 2, 2, 3, 4, 7, 8] # 生成分界标记:当前元素与前一个元素差>1时标记为1,否则为0 diff_markers = [0] + [1 if data[i] - data[i-1] > 1 else 0 for i in range(1, len(data))] # 累加标记得到分组键,同一组的键值相同 group_keys = accumulate(diff_markers, operator.add) # 按分组键分组并提取元素 for _, group in groupby(zip(group_keys, data), key=lambda x: x[0]): print([item[1] for item in group])
运行结果:
[1, 2, 2, 2, 3, 4] [7, 8]
方法2:普通循环实现(更直观)
如果不需要使用groupby,直接遍历列表维护当前组即可,逻辑更清晰:
data = [1, 2, 2, 2, 3, 4, 7, 8] if not data: print([]) groups = [[data[0]]] for num in data[1:]: # 判断当前元素与组内最后一个元素的差是否<=1(连续或重复) if num - groups[-1][-1] <= 1: groups[-1].append(num) else: groups.append([num]) for g in groups: print(g)
内容的提问来源于stack exchange,提问作者Pankaj Daga
相关产品推荐
相关产品推荐

