【问题标题】:Using recursion to create a list combination使用递归创建列表组合
【发布时间】:2014-10-01 18:54:58
【问题描述】:

我无法从列表中创建元素组合。

我想做的是在 Python 中创建一个递归函数,它返回元素的组合,例如列表 a = [1,2,3,4,5,6,7,8],结果将是组合 [1,2,3,4],[1,3, 4,5],[1,4,5,6],[1,2,4,5] 等。对于 8 个元素,它应该返回 70 个组合(如果我的数学计算正确的话)。虽然最好的选择是不重复组合。

我尝试对其进行编码,但我得到的只是[1,2,3,4],[1,3,4,5] etc 而不是组合[1,5,7,8]

我知道有一个特殊的功能,但我想递归地做。有什么建议吗?

nimed = ["A","B","C","D","E","F","G","H"]


def kombinatsioonid(listike,popitav):
  if len(listike) < 4:
      return
  tyhi = []
  for c in range(len(listike)):
      tyhi.append(listike[c])
  listike.pop(popitav)
  print(tyhi)
  kombinatsioonid(listike,popitav)

kombinatsioonid(nimed,1) 

【问题讨论】:

  • 瓦特是你的输出和你想要的输出之间的差异
  • 好吧,例如,我没有得到像 [A,E,G,H] 这样的组合或上面 [1,5,7,8] 的组合
  • 使用itertools.permutations()不是更好吗?
  • 这确实很棒,但我将其作为一个学校项目来做,这特别要求我们不要使用 itertools。这只是更大计划的一部分,但我目前停留在这一点上。
  • "只是一个编辑" 将你的 forloop 更改为:for c in listike:tyhi.append(c)

标签: python recursion


【解决方案1】:

这可以通过这种方式完成:

def combination(l,n, mylist=[]):
    if not n:  print(mylist)
    for i in range(len(l)):
        mylist.append(l[i])
        combination(l[i+1:], n-1, mylist)
        mylist.pop()

l = ["A","B","C","D","E","F","G","H"]
n=4
combination(l, n)

【讨论】:

    【解决方案2】:

    对于a 中的每个元素x,从其右边的元素生成所有k-1 组合,并在每个元素前面加上x。如果k==0,只需返回一个空组合,从而退出递归:

    def combs(a, k):
        if k == 0:
            return [[]]
        r = []
        for i, x in enumerate(a):
            for c in combs(a[i+1:], k - 1):
                r.append([x] + c)
        #print '\t' * k, k, 'of', a, '=', r
        return r
    

    取消注释“打印”行以查看发生了什么。

    作为旁注,最好使用英文变量和函数名称,只是为了互操作性(您的问题就是一个例子)。

    【讨论】:

    • 感谢您的帮助,这就是答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2017-07-08
    • 2017-12-08
    • 2012-08-23
    相关资源
    最近更新 更多