gpt4 book ai didi

python - 将列表函数应用于 itertools.groupby 中的嵌套生成器

转载 作者:太空狗 更新时间:2023-10-30 02:27:23 26 4
gpt4 key购买 nike

当应用于嵌套生成器时,list 函数的行为如何?在下面的代码片段中,我发现这种行为相当令人费解:似乎 list 消耗了大部分嵌套生成器,除了最后一个仍然保留一个元素:

>>> from itertools import groupby
>>> xs = [1, 2, 2, 3, 3]
>>> for k, g in list(groupby(xs)):
... print(k, list(g))
1 []
2 []
3 [3]

最佳答案

不,对 list 的调用不会消耗嵌套的迭代器/生成器。

该行为是 itertools.groupby 特有的并在文档中进行了描述:

The returned group is itself an iterator that shares the underlying iterable with groupby(). Because the source is shared, when the groupby() object is advanced, the previous group is no longer visible.

[强调我的]

如果您查看文档中提供的与 itertools.groupby 等效的 Python 源代码,这将变得更易于解释:

class groupby(object):
def __init__(self, iterable, key=None):
if key is None:
key = lambda x: x
self.keyfunc = key

self.it = iter(iterable) # shared iterator

self.tgtkey = self.currkey = self.currvalue = object()

def __iter__(self):
return self

def next(self):
while self.currkey == self.tgtkey:
self.currvalue = next(self.it) # Exit on StopIteration
self.currkey = self.keyfunc(self.currvalue)
self.tgtkey = self.currkey
return (self.currkey, self._grouper(self.tgtkey))

def _grouper(self, tgtkey):
while self.currkey == tgtkey:
yield self.currvalue
self.currvalue = next(self.it) # Exit on StopIteration
self.currkey = self.keyfunc(self.currvalue)

结果中显示的最后一个 [3]self.currvalue(由 _grouper 生成),它已经从先前在 groupby 对象上调用 next。

为了保留每个组的结果,您应该将它们存储在一个列表中,而不是一次性使用 groupby 对象。

关于python - 将列表函数应用于 itertools.groupby 中的嵌套生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41246209/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com