Филтрация списка от ложных и пустых элементов [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 xif 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)))