pyiter.grouping

 1from typing import Callable, Generic, Iterable, Iterator, List, NamedTuple
 2from .transform import Transform, T, K
 3from .list_like import ListLike
 4
 5
 6class Grouping(NamedTuple, Generic[K, T]):
 7    key: K
 8    values: ListLike[T]
 9
10
11class GroupingTransform(Transform[T, Grouping[K, T]]):
12    """
13    A transform that groups elements of an iterable by a key function.
14    """
15
16    def __init__(self, iter: Iterable[T], key_func: Callable[[T], K]):
17        super().__init__(iter)
18        self.key_func = key_func
19
20    def __do_iter__(self) -> Iterator[Grouping[K, T]]:
21        from collections import OrderedDict
22        from .sequence import it
23
24        d: OrderedDict[K, List[T]] = OrderedDict()
25        for e in self.iter:
26            k = self.key_func(e)
27            v = d.get(k, [])
28            v.append(e)
29            if len(v) == 1:
30                d[k] = v
31        yield from it(d.items()).map(lambda x: Grouping(x[0], ListLike(x[1])))
class Grouping(typing.NamedTuple, typing.Generic[~K, ~T]):
7class Grouping(NamedTuple, Generic[K, T]):
8    key: K
9    values: ListLike[T]

Grouping(key, values)

Grouping(key: ~K, values: pyiter.list_like.ListLike[~T])

Create new instance of Grouping(key, values)

key: ~K

Alias for field number 0

Alias for field number 1

12class GroupingTransform(Transform[T, Grouping[K, T]]):
13    """
14    A transform that groups elements of an iterable by a key function.
15    """
16
17    def __init__(self, iter: Iterable[T], key_func: Callable[[T], K]):
18        super().__init__(iter)
19        self.key_func = key_func
20
21    def __do_iter__(self) -> Iterator[Grouping[K, T]]:
22        from collections import OrderedDict
23        from .sequence import it
24
25        d: OrderedDict[K, List[T]] = OrderedDict()
26        for e in self.iter:
27            k = self.key_func(e)
28            v = d.get(k, [])
29            v.append(e)
30            if len(v) == 1:
31                d[k] = v
32        yield from it(d.items()).map(lambda x: Grouping(x[0], ListLike(x[1])))

A transform that groups elements of an iterable by a key function.

key_func