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

Python如何按子列表末尾元素分组且保留子列表原有顺序

问题原因

itertools.groupby的设计逻辑是仅对连续出现的相同key元素合并分组,如果你原始列表中同句子索引的元素不是连续排列的,相同key的元素会被拆成多个独立分组,这是你看到顺序混乱、分组拆分的核心原因。同时groupby返回的分组迭代器只能遍历一次,额外操作也可能导致取值异常。

最优解决方法(无需依赖groupby,稳定保序)

用defaultdict按索引分组,Python 3.7+版本的字典默认保留插入顺序,完全匹配你要的「同组保留原始先后顺序」的需求,实现更稳妥:

from collections import defaultdict

# 初始化分组容器
group_map = defaultdict(list)
for item in splitcorp:
    # 如果需要去掉末尾的句子索引字段,就把append(item)改成append(item[0])
    group_map[item[1]].append(item)

# 按句子索引排序后转成目标嵌套列表格式
groupedcorp = sorted(group_map.values(), key=lambda x: x[0][1])

如果你坚持用groupby实现

需要先对原始列表做稳定排序,排序时优先按句子索引,次键保留原始位置,避免同组内顺序被打乱:

from itertools import groupby
from operator import itemgetter

# 给每个元素标注原始位置,排序时保证同索引元素按原始先后排列
sorted_corp = sorted(enumerate(splitcorp), key=lambda x: (x[1][1], x[0]))
# 分组后提取原始内容
groupedcorp = [
    # 要去掉末尾索引就把item改成item[0]
    [item for idx, item in g]
    for k, g in groupby(sorted_corp, key=lambda x: x[1][1])
]

内容的提问来源于stack exchange,提问作者BOBjwjwj3j3j

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:36:03