在python中找到列表的所有子列表

时间:2017-03-18 13:55:07

标签: python arrays python-2.7 list python-3.x

我需要找到第一个元素大于last的子列表的最大长度。

如果原始列表的第一个元素大于last,那么我只返回列表的长度。如果不是,我必须找到最大长度和第一个元素大于最后一个的列表子列表。

我编写了用于查找所有子列表和检查条件的编码。我的代码需要更多时间才能将更大的列表转换为子列表。我需要更有效地更改此代码。我认为获取子列表组合的方法需要更多时间。谁能为我提供有效的方式?

from  itertools import combinations

def combos_with_exclusion(lst,length):
    d=0

    for combo in combinations((e for e in lst),length):
        #yield list(combo)
        #print (list(combo))
        sublist=list(combo)
        #print(sublist[0])
        le=len(sublist)
        if(sublist[0]>sublist[le-1]):
            d=len(sublist)
        if(d!=0):
            break
    return d

4 个答案:

答案 0 :(得分:2)

这是一个非常直接的解决方案。它应该比你的解决方案快得多:

l = [1, 21, 34, 55, 2, 12, 43, 54, 43]
n = len(l)
max_len = 1
max_list = l[0]

for i, x in enumerate(l):
    for j in range(i + max_len, n):
        y = l[j]
        if x > y:
            max_len = j - i + 1
            max_list = l[i:j + 1]
print(max_len)
# 6
print(max_list)
# [55, 2, 12, 43, 54, 43]

答案 1 :(得分:2)

您不必先计算所有组合。

从整个列表开始。然后尝试所有长度为“list_length - 1”的子列表,然后是所有长度为“list_length - 2”的子列表,依此类推。

只要您获得满足要求的列表,就可以摆脱循环。无需尝试更短的列表。

def max_length(input_list):
    input_length = len(input_list)
    for i in range(input_length):
        for j in range(i + 1):
            if input_list[j] > input_list[input_length - i - 1 + j]:
                # return length
                return input_length - i
                # or return sublist, I'm not sure what you want
                return input_list[j: input_length - i + j]

print(max_length([1,5,7,8,9,6,4,2,3,5,7,8,6,2]))

答案 2 :(得分:1)

如果我没有误解你的意思,我试着写一些代码,这可能会有所帮助:

l1=[1,21,34,55,2,12,43,54,43]
l2=list(reversed(l1))

r=[]
for i in l1:
    for j in l2:
        if i>j:
            sublist=l1[l1.index(i):len(l1)-l2.index(j)]
            if sublist:
                r.append(sublist)
            break
print(r)
print(max([len(i) for i in r]))

输出继电器:

[[21, 34, 55, 2, 12], [34, 55, 2, 12], [55, 2, 12, 43, 54, 43], [54, 43]]
6

如果我错过了什么,请告诉我改进它。谢谢。

答案 3 :(得分:1)

你使用列表推导:

l=[1,21,34,55,2,12,43,54,43]

lst = [l[i:e+i+1] for i in range(len(l)) \
        for e, x in enumerate(l[i:]) \
        if x < l[i]]

print(max(lst, key=len))
#[55, 2, 12, 43, 54, 43]