为何itertools.groupby中分组g调用两次list后消失及解决方法
关于itertools.groupby迭代器耗尽的问题解答
嘿,这个问题我太熟悉了!其实核心原因跟itertools.groupby返回的g的类型有关——它是一个迭代器,而不是普通的列表。
为什么会出现空列表?
迭代器有个关键特性:只能被遍历一次。当你第一次调用list(g)的时候,已经把迭代器里的所有元素都取出来转换成列表了,这时候迭代器内部的指针已经走到了末尾,没有剩余元素了。所以后续再调用list(g),自然只能得到空列表。而分组键k是提前确定好的(它是当前分组的元素值),不需要遍历迭代器,所以不会受影响。
举个直观的反例,你原来的代码可能是这样的:
from itertools import groupby a = [1,1,2,2,3] for k, g in groupby(a): # 第一次遍历迭代器g,得到长度 if len(list(g)) > 1: # 第二次遍历g,此时迭代器已经耗尽,返回空列表 print(f"键{k}对应的元素:{list(g)}")
运行这段代码会输出:
键1对应的元素:[] 键2对应的元素:[]
解决办法
解决思路很简单:提前把迭代器转换成列表并保存起来,后续所有操作都用这个保存好的列表,不要直接操作原迭代器。
修改后的代码示例:
from itertools import groupby a = [1,1,2,2,3] for k, g in groupby(a): # 先把迭代器转换成列表,一次性取出所有元素 group_elements = list(g) # 用保存好的列表做判断和后续操作 if len(group_elements) > 1: print(f"键{k}对应的元素:{group_elements}")
运行这段代码就会得到正常结果:
键1对应的元素:[1, 1] 键2对应的元素:[2, 2]
另外补充个小提醒:groupby是对连续的相同元素进行分组的,如果你的原列表不是连续相同元素的结构,记得先排序再分组,否则会得到不符合预期的分组结果~
内容的提问来源于stack exchange,提问作者David Arenburg
相关产品推荐
相关产品推荐

