显然是用 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 的反面?

为啥 itertools.groupby() 不起作用? [复制]

python中的itertools.groupby()

使 Pandas groupby 的行为类似于 itertools groupby

为啥 itertools.groupby 可以将 NaN 分组在列表中而不是 numpy 数组中

itertools.groupby 返回错误的结果(这与排序无关)[重复]