Source code for lalandre_core.utils.collection_utils

"""
Collection utilities.
Helpers for de-duplicating lists of dictionaries.
"""

from typing import Any, Dict, Iterable, List, Sequence, Tuple


[docs] def deduplicate_dicts_by_id( items: Iterable[Dict[str, Any] | None], id_key: str = "id", ) -> List[Dict[str, Any]]: """Return items with duplicates removed based on a single key.""" seen: set[Any] = set() result: List[Dict[str, Any]] = [] for item in items: if item is None: continue item_id = item.get(id_key) if item_id is None: result.append(item) continue if item_id in seen: continue seen.add(item_id) result.append(item) return result
[docs] def deduplicate_dicts_by_tuple_key( items: Iterable[Dict[str, Any] | None], keys: Sequence[str], ) -> List[Dict[str, Any]]: """Return items with duplicates removed based on a tuple of keys.""" seen: set[Tuple[Any, ...]] = set() result: List[Dict[str, Any]] = [] for item in items: if item is None: continue values: List[Any] = [] missing = False for key in keys: value = item.get(key) if value is None: missing = True break values.append(value) if missing: result.append(item) continue key_tuple: Tuple[Any, ...] = tuple(values) if key_tuple in seen: continue seen.add(key_tuple) result.append(item) return result