Skip to content

capturegraph.data.containers.utilities.compact #

compact - Remove Missing Values#

Remove MissingType values from nested List/Dict structures.

Example
from capturegraph.data import compact

# Remove Missing values from a list
data = List([1, Missing, 2, Missing, 3])
compact(data)
# → List([1, 2, 3])

# Works with nested structures
nested = List([List([1, Missing]), List([Missing, 2])])
compact(nested)
# → List([List([1]), List([2])])

compact(data) #

Remove MissingType values from a collection.

Recursively filters out Missing values from nested List/Dict structures. Returns MissingType if all values are Missing (or the collection is empty).

Parameters:

Name Type Description Default
data Any

A List or Dict potentially containing MissingType values.

required

Returns:

Type Description
Any

Filtered collection, or MissingType if nothing remains.

Example
compact(List([1, Missing, 2, Missing]))
# List([1, 2])

compact(List([Missing, Missing]))
# MissingType(ValueError: All values are missing)
Source code in capturegraph-lib/capturegraph/data/containers/utilities/compact.py
def compact(data: Any) -> Any:
    """Remove MissingType values from a collection.

    Recursively filters out Missing values from nested List/Dict structures.
    Returns MissingType if all values are Missing (or the collection is empty).

    Args:
        data: A List or Dict potentially containing MissingType values.

    Returns:
        Filtered collection, or MissingType if nothing remains.

    Example:
        ```python
        compact(List([1, Missing, 2, Missing]))
        # List([1, 2])

        compact(List([Missing, Missing]))
        # MissingType(ValueError: All values are missing)
        ```
    """
    if isinstance(data, list):
        recursed = [compact(v) for v in data]
        filtered = [v for v in recursed if not is_missing(v)]

        if len(filtered) == 0:
            return MissingType(ValueError("All values are missing"))

        return List(filtered)

    elif isinstance(data, dict):
        recursed = {k: compact(v) for k, v in data.items()}
        filtered = {k: v for k, v in recursed.items() if not is_missing(v)}

        if len(filtered) == 0:
            return MissingType(ValueError("All values are missing"))

        return Dict(filtered)

    return data