我在这里看到了这段代码:https://docs.python.org/3/library/itertools.html?highlight=groupby#itertools.groupby
class groupby:
# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
def __init__(self, iterable, key=None):
if key is None:
key = lambda x: x
self.keyfunc = key
self.it = iter(iterable)
self.tgtkey = self.currkey = self.currvalue = object()
def __iter__(self):
return self
def __next__(self):
self.id = object()
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, self.id))
def _grouper(self, tgtkey, id):
while self.id is id and self.currkey == tgtkey:
yield self.currvalue
try:
self.currvalue = next(self.it)
except StopIteration:
return
self.currkey = self.keyfunc(self.currvalue)
在while self.id is id and self.currkey == tgtkey:
的情况下,我想知道哪种情况会导致self.id is id
变成False
?
答案 0 :(得分:0)
条件while self.id is id and self.currkey == tgtkey:
的大致含义是:“当用户没有再次致电next
时,我们就在同一组中:”。 self.id
是__next__
设置的属性。本地引用id
是_grouper
在self.id
被调用时的引用。由于每次对next
的调用都会产生一个新的object
,因此检查等同于询问自__next__
开始以来是否已调用grouper
。
请记住,groupby
对象不必对存储的序列进行操作。输入可以是惰性生成器。请注意,函数始终会预先读取以确保下一项在当前组中,并且只有在当前项才产生。 __next__
的第一部分将消耗迭代器的剩余部分,直到下一组开始为止,以完全履行合同的这一部分,以防您在消耗当前一组之前请求下一组。