def data_has_value_from_substring_list(data, needle_list):
    """Recursively search for any values that contain a substring from the specified list

    Args:
        data (dict, list, primitive)
        needle_list (list)

    Returns:
        (bool) True or False if found
    """
    if isinstance(data, list):
        return any(data_has_value_from_substring_list(item, needle_list) for item in data)

    if isinstance(data, dict):
        return any(data_has_value_from_substring_list(v, needle_list) for v in data.values())

    if not data:
        return False

    return any(needle in data for needle in needle_list)