在Python中查找列表中最长的列表

时间:2015-06-17 21:18:15

标签: python list

我必须在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

也许递归会有所帮助? 谢谢!

10 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

以下是任何深度列表的递归解决方案:

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 :(得分:2)

以下内容将为您提供最长链接的索引:

import numpy as np
def find_max_list_idx(list):
    list_len = [len(i) for i in list]
    return np.argmax(np.array(list_len))

示例

a=[[1],[1,2,3],[3,4]]
print(find_max_list_idx(a))

'''
it will print index 1 as output
'''

答案 3 :(得分:1)

确实,递归可以解决这个问题。

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 :(得分:1)

您可以使用递归执行此操作:

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

(online demo)

代码首先检查我们正在处理这个is list。如果是这样,我们首先采用列表的len。接下来,我们对其元素执行递归调用。并计算元素的最大longest。如果最大值大于长度本身。我们返回最大值,否则返回长度。

因为非列表的longest为零,递归将停止,我们有一个答案,可以在归纳步骤中使用单个元素。

答案 5 :(得分:0)

使用map的另一个递归函数:

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
ACE.OLEDB

答案 6 :(得分:0)

这些简单的几行对我有用,我的列表是嵌套的(列表列表)

#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 :(得分:0)

使用toolz library,可以像这样实现:

from toolz.curried import count

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

一个警告:如果your_list包含不可重复项,则此操作无效。

答案 8 :(得分:0)

您可以利用enumeratesortedlist的行为:

ll = [[10,20], [1,2,3,4,5], [7,8,9]]
longest = ll[sorted([(i,len(l)) for i,l in enumerate(ll)], key=lambda t: t[1])[-1][0]]

>>longest
>>[1,2,3,4,5]

说明

  1. list中创建tuple,将索引作为第一个元素,将len(l)(列表长度)作为第二个元素:

    [(i,len(l)) for i,l in enumerate(ll)]

    >>[(0, 2), (1, 5), (2, 3)]

  2. 在列表中按元组中第二个元素排序,该元素的长度最长的元组到达列表的末尾:

    sorted([(i,len(l)) for i,l in enumerate(ll)], key=lambda t: t[1])

    >>[(0, 2), (2, 3), (1, 5)]

  3. 捕获最后一个元组及其第一个元素:

    sorted([(i,len(l)) for i,l in enumerate(ll)], key=lambda t: t[1])[-1][0]

    >>1

  4. 使用以上结果作为ll中的索引以获取最长的列表:

    ll[sorted([(i,len(l)) for i,l in enumerate(ll)], key=lambda t: t[1])[-1][0]]

    >>[1,2,3,4,5]

答案 9 :(得分:0)

只需要一行:

max([len(i) for i in lst)])

lst 是列表列表时。