Поскольку вы не знаете точно, сколько уровней до go каждый раз, рекурсия может быть естественным выбором здесь.
Отсюда нам нужны шаг и условие остановки , Я предполагаю, что они довольно очевидны в этом вопросе: шаг должен быть на go вниз на один уровень списка каждый раз, в то время как условие остановки будет, когда мы достигнем "листового" списка - тот, который не имеет больше вложенных списков.
Чтобы обнаружить такой список, мы можем использовать обработку ошибок:
def minimize(l):
try:
return [minimize(elem) for elem in l]
except TypeError:
return [min(l)]
Эта функция выполняет итерации по элементам аргумента списка и пытается добавить рекурсивный вызов к результат. Когда мы делаем рекурсивный вызов в списке leaf , этот вызов завершится ошибкой, потому что элементы не повторяются. Это приведет нас на один уровень вверх к списку leaf , и мы вернем наименьшее значение.
Это означает, что эта функция будет работать с любым количеством вложений, даже с плоским списком:
>>> minimize([[[5,4,7],[4,2,1],[1,9,5,4]],[[3,5],[6,5,2]],[2,5,3,7]])
[[[4], [1], [1]], [[3], [2]], [2]]
>>> minimize([5, 4, 3, 2, 1])
[1]