Подтвердить что ты не робот

Поиск самого длинного списка в списке списков в 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

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

4b9b3361

Ответ 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]))

Ответ 2

Версия 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

Ответ 3

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

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

Ответ 4

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

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 не-списка равен нулю, рекурсия будет остановлена, и у нас есть ответ для отдельных элементов, которые будут использоваться на индуктивном этапе.

Ответ 5

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

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

Ответ 6

Эти простые несколько строк работают для меня, мой список является вложенным (список списков)

#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)

Ответ 7

Используя библиотеку инструментов, это может быть достигнуто следующим образом:

from toolz.curried import count

def longest(your_list): 
    return max(map(count, your_list))

Одно предостережение: это не работает, если your_list содержит не повторяемые элементы.