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
相关产品推荐
相关产品推荐

