Возвращение второго наименьшего числа во вложенном списке с использованием рекурсии

Я должен вернуть второе наименьшее число в списке python с использованием рекурсии и без циклов . То, что я сделал, создано вспомогательной функцией, которая возвращает кортеж (наименьших, вторых наименьших) значений в списке, а затем я просто беру tuple[1] в моей функции second_smallest .

 def s_smallest(L): if(len(L) == 2): if (L[0] >= L[1]): return (L[1],L[0]) else: return (L[0],L[1]) else: first_smallest,second_smallest = s_smallest(L[1:]) if L[0] >= first_smallest and L[0] <= second_smallest: return (first_smallest, L[0]) elif L[0] <= first_smallest: return (L[0], first_smallest) else: return (first_smallest, second_smallest) 

Это работает, но теперь мне нужно обрабатывать вложенные списки , поэтому s_smallest([1,2,[3,0]]) должен возвращать (0,1) . Я попытался сделать это:

 if isinstance(L[0],list): first_smallest,second_smallest = s_smallest(L[0]) else: first_smallest,second_smallest = s_smallest(L[1:]) 

для получения первых наименьших и вторых наименьших значений, если это список, но я получаю сообщение об ошибке builtins.TypeError: unorderable types: int() >= list() . Как я могу исправить эту проблему для работы с вложенными списками?

2 Solutions collect form web for “Возвращение второго наименьшего числа во вложенном списке с использованием рекурсии”

Я мог бы предложить отделить список disesting и минимальное сокращение до двух отдельных, четко определенных задач

  • deepReduce уменьшит список списков, используя указанную функцию уменьшения
  • deepMin выполняет deepReduce с использованием min
 import math # used for math.inf def min (x,y): return x if x < y else y def deepReduce (f, y, xs): if not xs: return y elif isinstance(xs[0], list): return deepReduce(f, deepReduce(f, y, xs[0]), xs[1:]) else: return deepReduce(f, f(y, xs[0]), xs[1:]) def deepMin (xs): return deepReduce (min, math.inf, xs) data = [1,2,[7,[6,1,3,[0,4,3]],3,4],2,1] print(deepMin(data)) # 0 

О, но ты сказал, что хочешь второго наименьшего числа. Давайте немного поработаем над этим кодом. Конечно, я знал, что все это время, но ответ на этот вопрос дважды позволяет мне продемонстрировать универсальность этой конкретной реализации – Изменения жирным шрифтом

 def min2 (xs, y): # x1 is the smallest, x2 is second smallest x1, x2 = xs if (y < x1) and (y < x2): return (y, x2) elif y < x2: return (x1, y) else: return (x1, x2) def deepMin 2 (xs): # notice we change to use tuple of math.inf now x1, x2 = deepReduce ( min2 , (math.inf, math.inf ) , xs) return x2 data = [1,2,[7,[6,1,3,[0,4,3]],3,4],2,1] print(deepMin 2 (data)) # 1 

Я должен указать, что нам вообще не нужно было касаться deepReduce , и в этом-то и дело – мы должны делать любую произвольную глубокую операцию в нашем вложенном списке, не ставя статически кодировать это поведение в нашу функцию.

Теперь вы можете написать любой глубокий редуктор, который вы хотите, и назовите его с помощью функции deepReduce

Полное решение

Используя ничего, кроме functools.reduce , no loops, обрабатывать списки произвольной вложенности:

 import functools def helper(acc, x): if type(x) is list: return functools.reduce(lambda acc, x: helper(acc, x), x, acc) else: if x < acc[0]: return (x, acc[0]) elif x < acc[1]: return (acc[0], x) else: return (acc[0], acc[1]) def second_smallest(l): if len(l) < 2: return None else: if l[0] <= l[1]: return functools.reduce(lambda acc, x: helper(acc, x), l[2:], (l[0], l[1])) else: return functools.reduce(lambda acc, x: helper(acc, x), l[2:], (l[1], l[0])) >>> second_smallest([1,2,[0,3,[-1,-2]]]) (-2, -1) 
  • Преобразование словаря в список
  • Изменить значения в списке словарей?
  • создание списка по умолчанию в python
  • Сортировка списка строк по части строки
  • список сортировки нечувствителен к регистру с помощью operator.attrgetter
  • В чем разница между = b и a = b
  • Преобразование Python списка строк в список кортежей
  • Лучший способ сортировки словаря в группы с использованием Python
  •  
    Interesting Posts for Van-Lav

    Когда мне нужно использовать ключевое слово global в python

    Решение кубического уравнения

    Как объект int () использует оператор «==» без метода __eq __ () в python2?

    Разбор файла с разделителями табуляции в отдельные списки или строки

    Mac OS X / bin / bash: команда python: не найдена в некоторой среде IDE

    Тестирование, что я подключился к определенному сигналу в Django

    python: функция замены re.sub не принимает дополнительные аргументы – как избежать глобальной переменной?

    Как получить имя функции в виде строки в Python?

    Как получить URL-адрес перенаправления HTTP-перенаправления?

    Замените строку, расположенную между

    Использование TraitsUI в Mayavi для создания графического интерфейса, моделирования магнитного поля

    Как AES в CTR работает для Python с PyCrypto?

    Странное поведение Python – это оператор, если он сочетается с 'in'

    Django: неверный аргумент ключевого слова для этой функции

    как заменить несколько символов в строке?

    Python - лучший язык программирования в мире.