Ответ 1
Вот рекурсивное решение для любого списка глубин:
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.
Например:
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
Может быть, рекурсия поможет? Спасибо!
Вот рекурсивное решение для любого списка глубин:
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
Эти простые несколько строк работают для меня, мой список является вложенным (список списков)
#define the function#
def find_max_list(list):
list_len = [len(i) for i in list]
print(max(list_len))
#print output#
find_max_list(your_list)
Используя библиотеку инструментов, это может быть достигнуто следующим образом:
from toolz.curried import count
def longest(your_list):
return max(map(count, your_list))
Одно предостережение: это не работает, если your_list
содержит не повторяемые элементы.