Python itertools.groupby仅打印计数时结果异常的原因
为什么itertools.groupby两种遍历方式结果不同?
核心原因
itertools.groupby()返回的迭代器,每个元素是**(分组键, 分组迭代器)**的二元元组。两种遍历方式的差异,本质是对这个元组的处理方式不同:
正确遍历(键+计数)
当你写for key, group in groups时,是对每个二元元组做了解构赋值:元组的第一个元素(分组的键,比如1、2)被赋值给key,第二个元素(对应分组的迭代器)被赋值给group。此时len(list(group))是把分组迭代器转成列表,统计该分组内元素的数量,结果自然符合预期。错误遍历(仅计数)
当你写for group in groups时,group变量接收的是整个二元元组(比如(1, <itertools._grouper object at 0x...>))。此时len(list(group))是把这个二元元组转成列表,得到[key, 分组迭代器],这个列表的长度固定为2,所以每次打印的结果都是2。
验证示例
你可以修改第二个代码,打印出每个group的实际内容,就能直观看到问题:
from itertools import groupby data = [1, 1, 3, 2, 3, 3, 4, 5, 5] sorted_data = sorted(data) groups = groupby(sorted_data) for item in groups: print("当前元素:", item) print("转成列表:", list(item)) print("列表长度:", len(list(item))) print("---")
输出会类似:
当前元素: (1, <itertools._grouper object at 0x1023a4d90>) 转成列表: [1, <itertools._grouper object at 0x1023a4d90>] 列表长度: 2 --- 当前元素: (2, <itertools._grouper object at 0x1023a4df0>) 转成列表: [2, <itertools._grouper object at 0x1023a4df0>] 列表长度: 2 --- ...
修正方案
如果只想打印计数,正确的写法还是要解构元组,忽略键即可:
from itertools import groupby data = [1, 1, 3, 2, 3, 3, 4, 5, 5] sorted_data = sorted(data) groups = groupby(sorted_data) for _, group in groups: # 用下划线忽略键 print(len(list(group)))
这样就能得到预期的2、1、3、1、2。
内容的提问来源于stack exchange,提问作者Partha Pratim Sarma
相关产品推荐
相关产品推荐

