aidial_adapter_bedrock/utils/list.py (27 lines of code) (raw):

from typing import Any, Callable, Container, List, TypeVar _T = TypeVar("_T") _V = TypeVar("_V") def select_by_indices(lst: List[_T], indices: Container[int]) -> List[_T]: return [elem for idx, elem in enumerate(lst) if idx in indices] def omit_by_indices(lst: List[_T], indices: Container[int]) -> List[_T]: return [elem for idx, elem in enumerate(lst) if idx not in indices] def group_by( lst: List[_T], key: Callable[[_T], Any], init: Callable[[_T], _V], merge: Callable[[_V, _T], _V], ) -> List[_V]: def _gen(): if not lst: return prev_val = init(lst[0]) prev_key = key(lst[0]) for elem in lst[1:]: if prev_key == key(elem): prev_val = merge(prev_val, elem) else: yield prev_val prev_val = init(elem) prev_key = key(elem) yield prev_val return list(_gen())