hbutils.collection.sequence

Collection utility module providing functions for sequence manipulation and grouping operations.

This module offers utilities for working with collections, including: - Removing duplicates while preserving order - Grouping elements by custom criteria with optional post-processing

The functions are designed to be type-safe and work with various sequence types.

unique

hbutils.collection.sequence.unique(s: Sequence[_ElementType]) Sequence[_ElementType][source]

Unique all the values in the given s, preserving its original order.

Parameters:

s (Union[Sequence[_ElementType]]) – Original sequence.

Returns:

Unique sequence, with the original type.

Return type:

Sequence[_ElementType]

Examples::
>>> from hbutils.collection import unique
>>>
>>> unique([1, 2, 3, 1])
[1, 2, 3]
>>> unique(('a', 'b', 'a', 'c', 'd', 'e', 'b'))
('a', 'b', 'c', 'd', 'e')
>>> unique([3, 1, 2, 1, 4, 3])
[3, 1, 2, 4]

group_by

hbutils.collection.sequence.group_by(s: Iterable[_ElementType], key: Callable[[_ElementType], _GroupType], gfunc: Callable[[List[_ElementType]], _ResultType] | None = None) Dict[_GroupType, _ResultType][source]

Divide the elements into groups.

Parameters:
  • s (Iterable[_ElementType]) – Elements to be grouped.

  • key (Callable[[_ElementType], _GroupType]) – Group key, should be a callable object that extracts the grouping key from each element.

  • gfunc (Optional[Callable[[List[_ElementType]], _ResultType]]) – Post-process function for groups, should be a callable object. Default is None which means no post-processing will be performed and raw lists will be returned.

Returns:

Grouping result as a dictionary mapping group keys to processed group values.

Return type:

Dict[_GroupType, _ResultType]

Examples::
>>> from hbutils.collection import group_by
>>>
>>> foods = [
...     'apple', 'orange', 'pear',
...     'banana', 'fish', 'pork', 'milk',
... ]
>>> group_by(foods, len)  # group by length
{5: ['apple'], 6: ['orange', 'banana'], 4: ['pear', 'fish', 'pork', 'milk']}
>>> group_by(foods, len, len)  # group and get length
{5: 1, 6: 2, 4: 4}
>>> group_by(foods, lambda x: x[0])  # group by first letter
{'a': ['apple'], 'o': ['orange'], 'p': ['pear', 'pork'], 'b': ['banana'], 'f': ['fish'], 'm': ['milk']}
>>> group_by(foods, lambda x: x[0], len)  # group and get length
{'a': 1, 'o': 1, 'p': 2, 'b': 1, 'f': 1, 'm': 1}