You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 19:44:53