【问题标题】:List all contiguous sub-arrays列出所有连续的子数组
【发布时间】:2017-05-25 10:04:14
【问题描述】:

我有一个整数数组[1, 2, 3],我需要返回这个数组的所有可能的连续子数组组合。

[[1],[2],[3],[1,2],[2,3],[1,2,3]]

我怎样才能用 python 处理呢?一种方法是有 2 个循环和数组本身,但应该有更好的方法。

【问题讨论】:

  • 请展示您的解决方案以及另一个可能“更好”的解决方案。
  • @Wondercricket:虽然所有连续子列表确实是组合,但并非所有组合都是连续子列表

标签: python arrays python-3.x


【解决方案1】:

单线解决方案(我不知道对你来说“更好的方法”是什么意思)

L = [1,2,3]
[L[i:i+j] for i in range(0,len(L)) for j in range(1,len(L)-i+1)]

L=[1,2,3,4]
[L[i:i+j] for i in range(0,len(L)) for j in range(1,len(L)-i+1)]

你明白了,

[[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]

[[1],
 [1, 2],
 [1, 2, 3],
 [1, 2, 3, 4],
 [2],
 [2, 3],
 [2, 3, 4],
 [3],
 [3, 4],
 [4]]

【讨论】:

    【解决方案2】:

    简化 Inspector 的解决方案:

    def getAllWindows(L):
        for w in range(1, len(L)+1):
            for i in range(len(L)-w+1):
                yield L[i:i+w]
    

    还有一个完全不使用循环的解决方案:

    def allSubArrays(L,L2=None):
        if L2==None:
            L2 = L[:-1]
        if L==[]:
            if L2==[]:
                return []
            return allSubArrays(L2,L2[:-1])
        return [L]+allSubArrays(L[1:],L2)
    

    【讨论】:

      【解决方案3】:
      def kwindow(L, k):
          for i in range(len(L)-k+1):
              yield L[i:i+k]
      
      
      def getAllWindows(L):
          for w in range(1, len(L)+1):
              yield from kwindow(L, w)
      

      输出:

      In [39]: for i in getAllWindows([1,2,3]): print(i)
      [1]
      [2]
      [3]
      [1, 2]
      [2, 3]
      [1, 2, 3]
      

      【讨论】:

        【解决方案4】:

        基于itertools 的方法:

        import itertools
        
        def allSubArrays(xs):
            n = len(xs)
            indices = list(range(n+1))
            for i,j in itertools.combinations(indices,2):
                yield xs[i:j]
        

        例如:

        >>> list(allSubArrays([1,2,3]))
        [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
        

        【讨论】:

          【解决方案5】:
          li=[1,2,3]
          l=[]
          for i in range(length(li)):
              for j in range(i,len(li)+1):
                  if i==j:                   *cancelling empty sublist item*
                      continue
                  else:
                      subli=li[i:j]
                      l.append(subli)
           print(l)
          

          输出:

          [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
          

          【讨论】:

          猜你喜欢
          • 2020-06-24
          • 2020-12-02
          • 2015-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-25
          • 2015-11-09
          • 1970-01-01
          相关资源
          最近更新 更多