显然是用 itertools.groupby 生成的空组
Posted
技术标签:
【中文标题】显然是用 itertools.groupby 生成的空组【英文标题】:Apparently empty groups generated with itertools.groupby 【发布时间】:2021-12-20 13:34:04 【问题描述】:我在使用 itertools 的 groupby 时遇到了一些问题
from itertools import groupby
for k, grp in groupby("aahfffddssssnnb"):
print(k, list(grp), list(grp))
输出是:
a ['a', 'a'] []
h ['h'] []
f ['f', 'f', 'f'] []
d ['d', 'd'] []
s ['s', 's', 's', 's'] []
n ['n', 'n'] []
b ['b'] []
它按预期工作。 itertools._grouper 对象似乎只能读取一次(也许是迭代器?)
但是:
li = [grp for k, grp in groupby("aahfffddssssnnb")]
list(li[0])
[]
list(li[1])
[]
它似乎是空的......我不明白为什么? 这个有效:
["".join(grp) for k, grp in groupby("aahfffddssssnnb")]
['aa', 'h', 'fff', 'dd', 'ssss', 'nn', 'b']
我使用的是 3.9.9 版本 已向新闻组 comp.lang.python 提出问题,但没有任何答案
【问题讨论】:
【参考方案1】:grp
是与 groupby
相同的主迭代器的子迭代器。为每个键创建一个新的。
当您跳到下一个键时,旧的grp
不再可用,因为您将主迭代器推进到当前组之外。
Python documentation里写的很清楚:
返回的组本身是一个迭代器,它与 groupby() 共享底层迭代。因为源是共享的,所以当 groupby() 对象高级时,之前的组不再可见。因此,如果以后需要该数据,则应将其存储为列表:
k, g in groupby(data, keyfunc): groups.append(list(g)) # Store group iterator as a list uniquekeys.append(k)
【讨论】:
以上是关于显然是用 itertools.groupby 生成的空组的主要内容,如果未能解决你的问题,请参考以下文章
为啥 itertools.groupby() 不起作用? [复制]
使 Pandas groupby 的行为类似于 itertools groupby