Сложить все значения списка включая вложенные кортежи
Как сложить все значения например вот такого списка [(5, 6, 7), 5], желательно не перебирая все значения в цикле, так как может быть еще и вложенный картеж например [(5, (6, 5), 7), 5], степень вложенности может быть разная. Функция sum не работает? Получается только переводить список в строку, очищать от скобок и запятых потом назад все в список и суммировать? Или есть другой способ?
Ответы (2 шт):
Вариант без рекурсии со стеком и циклами. Работает с любой вложенностью tuple, list, set. Суммирует только int и float, строки игнорирует.
t = (1, (2.34, [5, 7], (2, 4, {1, 2, 3, 'ABC'})))
stack, summa = [t], 0
while stack:
el = stack.pop(0)
if isinstance(el, (tuple, list, set)):
for i in el:
stack.append(i)
elif isinstance(el, (int, float)):
summa += el
print(summa)
27.34
Я бы разделил работу на две части: обход элементов и суммирование. traverse - функция-генератор, которая обходит все элементы на всех уровнях. Нужна проверка можно ли итерировать элемент, нужна рекурсия для вложенных контейнеров. В остальном всё не сложно:
import collections.abc
def traverse(item):
if isinstance(item, collections.abc.Iterable):
for i in item:
yield from traverse(i)
else:
yield item
sum считает сумму любой последовательности. sum(traverse(...)) сложит все элементы, которые отыщет внутри ...:
print(sum(traverse([(5, (6, 5), 7), 5])))