我必须在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
也许递归会有所帮助? 谢谢!
答案 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
代码首先检查我们正在处理这个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)
您可以利用enumerate
,sorted
和list
的行为:
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]
说明
在list
中创建tuple
,将索引作为第一个元素,将len(l)
(列表长度)作为第二个元素:
[(i,len(l)) for i,l in enumerate(ll)]
>>[(0, 2), (1, 5), (2, 3)]
在列表中按元组中第二个元素排序,该元素的长度最长的元组到达列表的末尾:
sorted([(i,len(l)) for i,l in enumerate(ll)], key=lambda t: t[1])
>>[(0, 2), (2, 3), (1, 5)]
捕获最后一个元组及其第一个元素:
sorted([(i,len(l)) for i,l in enumerate(ll)], key=lambda t: t[1])[-1][0]
>>1
使用以上结果作为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
是列表列表时。