Филтрация списка от ложных и пустых элементов [False, None, 1, 0, -1, ""]

Предстоит написать функцию non_empty_truths(), которая с помощью генераторов списков должна вычислять копию входного списка списков, "очищенную" от ложных элементов (не только False, а любых ложных!), а заодно и от пустых списков — таковые могу присутствовать сами по себе или могут получаться после отбрасывания из них всех элементов.

Выглядеть использование полученной функции должно так:

>>> from solution import non_empty_truths
>>> non_empty_truths([])  # нечего отбрасывать, это тоже нормально
[]
>>> non_empty_truths([[], []])  # пустые отбрасываем
[]
>>> non_empty_truths([[0]])  # чистим, чистые, но пустые тоже отбрасываем
[]
>>> non_empty_truths([[0, ""], [False, None]])  # в Python многое считается ложным
[]
>>> non_empty_truths([[0, 1, 2], [], [], [False, True, 42]])
[[1, 2], [True, 42]]
>>>

Мое решение знаю топорное, как сделать более изящно?

def check_false(new_list):
    copy_list = new_list.copy()
    check_list = [False, None, 0, ""]
    sorter_list = [i for i in copy_list if i not in check_list]
    return sorter_list


# new_list = [False, None, 1, 0, -1, ""]
# print(check_false(new_list))


def non_empty_truths(list_numbers):
    copy_list = list_numbers.copy()
    for i, j in enumerate(copy_list):
        copy_list[i] = check_false(j)
    return list(filter(lambda val: val != [], copy_list))


print(non_empty_truths(list_numbers))

Ответы (1 шт):

Автор решения: gil9red

Немного рекурсии

Пояснение:

  • map(non_empty_truths, value) нужен для возврата новых значений для подсписков, например для [[0, ""], [False, None]] в функцию map попадет сначала [0, ""], после [False, None] и в обоих случаях вернется [], который не пройдет проверку if x
  • if not isinstance(value, list): нужно для контроля рекурсии, чтобы при переборе не вызвать for для не списка

Пример:

def non_empty_truths(value):
    if not isinstance(value, list):
        return value

    return [x for x in map(non_empty_truths, value) if x]


assert non_empty_truths([]) == []
assert non_empty_truths([[], []]) == []
assert non_empty_truths([[0]]) == []
assert non_empty_truths([[0, ""], [False, None]]) == []
assert non_empty_truths([[0, 1, 2], [], [], [False, True, 42]]) == [[1, 2], [True, 42]]

# Рекурсия решает :D
assert non_empty_truths([[[0, [None, ["", [0]]]]]]) == []

Если чисто в функциональном стиле вернуть список:

    return list(filter(None, map(non_empty_truths, value)))
→ Ссылка