Обойдите числовые листья вложенных списков и сложите их. Чтобы не зависеть от предела рекурсии Python, можно хранить стек итераторов: он занимает память пропорционально глубине вложения.
Функция для подсчёта суммы всех чисел в вложенных списках
Обойдите числовые листья вложенных списков и сложите их. Чтобы не зависеть от предела рекурсии Python, можно хранить стек итераторов: он занимает память пропорционально глубине вложения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Напишите функцию total_sum, которая вычисляет сумму всех чисел, находящихся в переданных списках, независимо от уровня вложенности. Функция принимает произвольное количество списков и должна корректно обрабатывать как простые элементы, так и вложенные списки произвольной глубины.
Примеры вызова:
total_sum([10, 21, 33], [14, 52], [7, 81, [9, 100]]) → 327
total_sum([3, [5, 6], 15, [5, 51]], [7, 81, [9, 100]]) → 282
total_sum([3, [5, [10, 15, [5, 6], 6], 61, [5, 5], 8]]) → 129
Ответ
Обойдите числовые листья вложенных списков и сложите их. Чтобы не зависеть от предела рекурсии Python, можно хранить стек итераторов: он занимает память пропорционально глубине вложения.
Итеративный обход ациклических списков:
def total_sum(*lists):
total = 0
stack = [iter(lists)]
while stack:
try:
item = next(stack[-1])
except StopIteration:
stack.pop()
continue
if isinstance(item, list):
stack.append(iter(item))
else:
total += item
return total
Пустые списки дают вклад 0. Для примеров результаты 327, 282 и 129. Предполагаются числовые листья с совместимым сложением; строки вызовут ошибку. Циклические ссылки на списки условием не предусмотрены и требуют отдельной защиты. Время линейно по числу посещённых элементов.