Альтернативное однострочное решение, которое сохраняет рекурсивную структуру ввода:
def filter_tree(tree, filter_func):
return tuple(filter_tree(element, filter_func) if isinstance(element, tuple) else element for element in tree if isinstance(element, tuple) or filter_func(element))
TEST
>>> print(filter_tree((0, 1, 2, (3, 4, (5, 6), 7), 8, 9, 10), lambda x: x % 2 == 0))
(0, 2, (4, (6,)), 8, 10)
>>>
Примерно эквивалентно:
def filter_tree(tree, filter_func):
filtered_tree = tuple()
for element in tree:
if isinstance(element, tuple):
filtered_tree += (filter_tree(element, filter_func),)
elif filter_func(element):
filtered_tree += (element,)
return filtered_tree