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