【问题标题】:python connected combinations of list items列表项的python连接组合
【发布时间】:2015-05-24 22:41:10
【问题描述】:

我有一个值列表[1,2,3,4,5,...],我想使用列表推导、numpy 或任何有效的方法返回所有可能的 连接 组合的列表。

通过连接,我的意思是列表中的项目对应该在组合中保持它们的邻接关系(不一定是具有相邻值的整数彼此相邻,尽管这样可以)。

明确地说,这是我想要返回的内容,在列表[1,2,3,4,5] 的情况下:

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

以下是我想要的物品类型:

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

我看过很多关于获得所有可能组合的帖子,但我还没有看到有人提出关于具有连通性约束的组合的问题。有什么想法吗?

【问题讨论】:

    标签: python list combinations


    【解决方案1】:

    这是列表理解的一种方式:

    >>> lst = [6, 7, 8, 9]
    >>> [lst[i:j] for j in range(len(lst)+1) for i in range(j)]
    [[6], [6, 7], [7], [6, 7, 8], [7, 8], [8], [6, 7, 8, 9], [7, 8, 9], [8, 9], [9]]
    

    或者,如果您重视订单并且我从您的示例中猜对了:

    >>> [lst[i:i+leng] for leng in range(len(lst), 0, -1) for i in range(len(lst)-leng+1)]
    [[6, 7, 8, 9], [6, 7, 8], [7, 8, 9], [6, 7], [7, 8], [8, 9], [6], [7], [8], [9]]
    

    或者itertools.combinations:

    >>> [lst[i:j] for i, j in combinations(range(len(lst)+1), 2)]
    [[6], [6, 7], [6, 7, 8], [6, 7, 8, 9], [7], [7, 8], [7, 8, 9], [8], [8, 9], [9]]
    

    甚至根本没有任何列表理解(但现在我变得愚蠢:-)

    >>> list(map(lst.__getitem__, starmap(slice, combinations(range(len(lst)+1), 2))))
    [[6], [6, 7], [6, 7, 8], [6, 7, 8, 9], [7], [7, 8], [7, 8, 9], [8], [8, 9], [9]]
    

    【讨论】:

      【解决方案2】:
      from itertools import islice
      def adj(l):
          ln = len(l)
          yield l
          for n in range(ln -1, 0, -1):
              yield from (list(islice(l, i, n + i)) for i in range(ln - n % ln+1))
      
      
      l = [1, 2, 3, 4, 5]
      print(list(adj(l)))
      [[1, 2, 3, 4, 5], [1, 2, 3, 4], [2, 3, 4, 5], [1, 2, 3], [2, 3, 4], [3, 4, 5], [1, 2], [2, 3], [3, 4], [4, 5], [1], [2], [3], [4], [5]]
      

      您也可以一次获取一个值,而无需将所有项目存储在内存中:

      def adj(l):
          ln = len(l)
          yield l
          for n in range(ln - 1, 0, -1):
              yield from (islice(l, i, n + i) for i in range(ln - n % ln+1))
      
      
      l = [1, 2, 3, 4, 5]
      
      for ele in adj(l):
          print(list(ele))
      

      输出:

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

      或者在每个切片上调用一个函数:

      for ele in adj(l):
          print(sum(ele))
      

      输出:

      15
      10
      14
      6
      9
      12
      3
      5
      7
      9
      1
      2
      3
      4
      5
      

      【讨论】:

      • def fl): ??我想你的意思是def f(l):
      【解决方案3】:

      我相信有很多方法可以做到这一点。我会建议一个简单的函数,它可能不是更 Pythonic 的解决方案。

      def c_list(A):
          B = []
          for i in range(len(A)):
              for j in range(len(A) - i):
                  B.append(A[j:j+i+1])
          return B
      
      A = [ 1,2,3,4,5 ]
      B = c_list(A)
      print B
      

      这个策略可以和列表理解一起使用,如果你喜欢的话:

      C = [A[j:j+i+1] for i in range(len(A)) for j in range(len(A)-i)]
      

      【讨论】:

        猜你喜欢
        • 2014-05-23
        • 2013-03-14
        • 1970-01-01
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多