Поиск самого длинного списка в списке списков в Python

Мне нужно дотянуть самый длинный список списков в Python.

Например:

longest([1,2,3]) возвращает 3

longest([[[1,2,3]]]) также возвращает 3 (внутренний список равен 3)

longest([[], [3,[4,5],[2,3,4,5,3,3], [7], 5, [1,2,3], [3,4]], [1,2,3,4,5]]) возвращает 7 (список [3,[4,5],[2,3,4,5,3,3], [7], 5, [1,2,3], [3,4]] содержит 7 элементов)

Прямо сейчас у меня есть этот код, но он не делает трюк с первыми двумя примерами.

 def longest(list1): longest_list = max(len(elem) for elem in list1) return longest_list 

Может быть, рекурсия поможет? Спасибо!

5 Solutions collect form web for “Поиск самого длинного списка в списке списков в Python”

Вот рекурсивное решение для любого списка глубин:

 def longest(l): if(not isinstance(l, list)): return(0) return(max([len(l),] + [len(subl) for subl in l if isinstance(subl, list)] + [longest(subl) for subl in l])) 

Версия Python 3.3:

 def lengths(x): if isinstance(x,list): yield len(x) for y in x: yield from lengths(y) 

Применение:

 >>> l = [[], [3,[4,5],[2,3,4,5,3,3], [7], 5, [1,2,3], [3,4]], [1,2,3,4,5]] >>> max(lengths(l)) 7 

В python 2.6+ у вас нет yield from инструкции (был введен в python 3.3), поэтому вам нужно немного изменить код:

 def lengths(x): if isinstance(x,list): yield len(x) for y in x: for z in lengths(y): yield z 

Действительно, рекурсия может решить эту проблему.

 def longest(lst): if type(lst) is not list: return 0 max = len(lst) for i in lst: max_i = longest(i) if max_i > max: max = max_i return max 

Вы можете сделать это с помощью рекурсии:

 def longest(list1) : l = 0 if type(list1) is list : l = len(list1) if l > 0 : l = max(l,max(longest(elem) for elem in list1)) return l 

(онлайн-демонстрация) .

Сначала код проверяет, имеет ли это is list мы имеем дело. Если это так, мы сначала берем len списка. Затем мы выполняем рекурсивный вызов его элементов. И вычислить максимальный longest из элементов. Если максимум больше самой длины. Мы возвращаем этот максимум, иначе мы возвращаем длину.

Поскольку самый longest из не-списка равен нулю, рекурсия будет остановлена, и у нас есть ответ для отдельных элементов, которые будут использоваться на индуктивном этапе.

Другая рекурсивная функция с использованием карты:

 def longest(a): return max(len(a), *map(longest, a)) if isinstance(a, list) and a else 0 

 In [2]: longest([1,2,3]) Out[2]: 3 In [3]: longest([[[1,2,3]]]) Out[3]: 3 In [4]: longest([[], [3,[4,5],[2,3,4,5,3,3], [7], 5, [1,2,3], [3,4]], [1,2,3,4,5]]) Out[4]: 7 

итеративно:

 def longest(a): mx = 0 stack = [a[:]] while stack: cur = stack.pop() if isinstance(cur, list): mx = max(mx, len(cur)) stack += cur return mx 

 In [6]: longest([1,2,3]) Out[6]: 3 In [7]: longest([[[1,2,3]]]) Out[7]: 3 In [8]: longest([[], [3,[4,5],[2,3,4,5,3,3], [7], 5, [1,2,3], [3,4]], [1,2,3,4,5]]) Out[8]: 7 
  • Python - возвращает наибольший из N списков
  • Самый быстрый или самый идиоматический способ удаления объекта из списка объектов в Python
  • Добавить элемент в указанный список в списке списков (Python)
  • Присвоить значение отдельной ячейке в двухмерном массиве python
  • Как удалить все экземпляры элемента из списка в Python?
  • Python: понимание разницы между добавлением и расширением
  • Индекс первого и последнего n элементов списка
  • Python: определить, являются ли все элементы списка одним и тем же элементом
  • Python - лучший язык программирования в мире.