Closed
Description
Approximate implementation:
def collectby(key_func, iterable, value_func=None, reduce_func=None):
collection = defaultdict(list) if reduce_func is None else {}
for item in iterable:
key = key_func(item)
if value_func is not None:
item = value_func(item)
if reduce_func is None:
collection[key].append(item)
else:
old_item = collection.get(key, sentinel)
if old_item is not sentinel:
item = reduce_func(old_item, item)
collection[key] = item
return collection