itertools.groupby仅对连续相同元素分组,必须先按分组键排序,否则同一键被拆成多组、统计错误、聚合失效;其底层为单次遍历,不回看、不缓存,设计目标是内存友好。
itertools.groupby 只对连续相同元素分组,不排序就用会导致分组断裂、漏数据、逻辑错乱。它不是按值“全局归类”,而是按“相邻重复”切片——就像手动扫描一串珠子,只在颜色突变时切一刀。
groupby 的底层逻辑是单次遍历:它记住上一个键值,一旦当前键 ≠ 上一个键,就触发新组。它不会回看、不建哈希表、不缓存全部数据。
看似代码能跑,但结果不可靠,且错误隐蔽:
[('a',1), ('b',2), ('a',3), ('a',4)] 按字母分组,会产出三组:('a', [1])、('b', [2])、('a', [3,4]) —— 实际想合并所有 'a'
排序键必须与 groupby 的 key 函数一致,且稳定(避免因相等元素位置变化导致分组不稳定):
sorted(data, key=lambda x: x[0]) 再传给 groupbydefaultdict(list))或 pandas.groupby对比以下两段输出:
未排序:from itertools import groupby
data = [('x',1), ('y',2), ('x',3), ('y',4), ('x',5)]
for k, g in groupby(data, key=lambda x: x[0]):
print(k, list(g))
# 输出:
# x [('x', 1)]
# y [('y', 2)]
# x [('x', 3), ('y', 4), ('x', 5)] ← 错!key 混了排序后:data_sorted = sorted(data, key=lambda x: x[0])
for k, g in groupby(data_sorted, key=lambda x: x[0]):
print(k, list(g))
# 输出:
# x [('x', 1), ('x', 3), ('x', 5)]
# y [('y', 2), ('y', 4)] ← 正确