itertools.groupby按照连续相同的键分组,并不会自动把整份数据中同键的记录聚到一起。看到A、B、A分成三组,通常是输入顺序与预期用途没有对齐。

先区分连续片段与全局分组
分析状态变化时,保留顺序得到A一段、B一段、A又一段可能正是需要的结果。如果目标是把所有A放在一起,可先按相同键排序。排序会改变原先的时间顺序,因此必须先明确问题。
需要留存的组立即转成列表
groupby产生的组迭代器共享底层输入。外层继续向前后,不能指望旧组还能完整读取。示例在循环内部立刻list(group),这样后续查看的是已经保存的内容。
用最小反例解释差异
下例同时检查原顺序与排序后结果,避免只用AAA、BBB这种天然相邻数据测试。真实记录若按某个字段分组,排序和groupby要使用一致的key函数。这里演示标准库,不等同于数据库的全局聚合。
可以运行的练习
from itertools import groupby
items = ["A", "B", "A"]
runs = [(key, list(group)) for key, group in groupby(items)]
merged = [(key, list(group)) for key, group in groupby(sorted(items))]
assert runs == [("A", ["A"]), ("B", ["B"]), ("A", ["A"])]
assert merged == [("A", ["A", "A"]), ("B", ["B"])]
print(runs)
print(merged)
示例已在本地隔离环境运行检查。使用固定输入,不访问外部接口,也不读取真实业务文件。
资料与继续学习
Python:itertools.groupby。资料查阅日期:2026年10月3日。步骤与练习由本站整理。
资料查阅与编辑日期:2026年10月3日。作者:玖柒。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END






