Author rhettinger
Recipients Matt Gilson, rhettinger
Date 2017-05-12.03:41:43
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1494560504.02.0.629367407473.issue30346@psf.upfronthosting.co.za>
In-reply-to
Content
FYI, the CPython behavior matches the pure python implementation show in the docs:

Python 3.6.1 (v3.6.1:69c0db5050, Mar 21 2017, 01:21:04) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> 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):
        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
            try:
                self.currvalue = next(self.it)
            except StopIteration:
                return
            self.currkey = self.keyfunc(self.currvalue)

>>> from operator import itemgetter
>>> inputs = ((x > 5, x) for x in range(10))
>>> (_, a), (_, b) = groupby(inputs, key=itemgetter(0))
>>> print(list(a))
[]
>>> print(list(b))
[(True, 9)]
History
Date User Action Args
2017-05-12 03:41:44rhettingersetrecipients: + rhettinger, Matt Gilson
2017-05-12 03:41:44rhettingersetmessageid: <1494560504.02.0.629367407473.issue30346@psf.upfronthosting.co.za>
2017-05-12 03:41:44rhettingerlinkissue30346 messages
2017-05-12 03:41:43rhettingercreate