[Python-Dev] "groupby" iterator
Greg Ball
gball at cfa.harvard.edu
Thu Nov 27 15:58:47 EST 2003
Here's a reworking which returns iterators. I had to decide what to do if
the user tries to access things out of order; I raise an exception.
Anything else would complicate the code quite a lot I think.
def groupby(key, iterable):
it = iter(iterable)
value = it.next() # If there are no items, this takes an early exit
oldkey = [key(value)]
cache = [value]
lock = []
def grouper():
yield cache.pop()
for value in it:
newkey = key(value)
if newkey == oldkey[0]:
yield value
else:
oldkey[0] = newkey
cache.append(value)
break
del lock[0]
while 1:
if lock:
raise LookupError, "groups accessed out of order"
if not cache:
break
lock.append(1)
yield grouper()
--Greg Ball
More information about the Python-Dev
mailing list