【问题标题】:find all sublist of list in python在python中查找列表的所有子列表
【发布时间】:2017-08-10 01:23:18
【问题描述】:

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

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

我编写了查找所有子列表和检查条件的代码。我的代码需要更多时间才能将较大的列表转换为子列表。我需要更有效地更改此代码。我认为获得子列表组合的方法需要更多时间。任何人都可以为我提供有效的方法吗?

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

【问题讨论】:

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


    【解决方案1】:

    您不必先计算所有组合。

    从整个列表开始。然后尝试所有长度为“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】:

      这是一个非常简单的解决方案。它应该比您的解决方案快得多:

      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]
      

      【讨论】:

      • 从最长的子列表向下搜索​​可让您在找到最长的子列表后立即跳出循环(请参阅我的答案)。
      【解决方案3】:

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

      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
      

      如果我遗漏了什么,请告诉我改进它。谢谢。

      【讨论】:

        【解决方案4】:

        您使用列表推导:

        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]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-20
          • 1970-01-01
          • 1970-01-01
          • 2023-01-02
          • 2022-11-25
          • 2020-07-18
          相关资源
          最近更新 更多