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

Python itertools.groupby仅打印计数时结果异常的原因

为什么itertools.groupby两种遍历方式结果不同?

核心原因

itertools.groupby()返回的迭代器,每个元素是**(分组键, 分组迭代器)**的二元元组。两种遍历方式的差异,本质是对这个元组的处理方式不同:

  1. 正确遍历(键+计数)
    当你写for key, group in groups时,是对每个二元元组做了解构赋值:元组的第一个元素(分组的键,比如1、2)被赋值给key,第二个元素(对应分组的迭代器)被赋值给group。此时len(list(group))是把分组迭代器转成列表,统计该分组内元素的数量,结果自然符合预期。

  2. 错误遍历(仅计数)
    当你写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 01:28:23