Python 使用递归创建列表组合

Python 使用递归创建列表组合,python,recursion,Python,Recursion,从列表中创建元素组合时遇到问题 我想做的是在Python中创建一个递归函数,它返回元素的组合,例如lista=[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]等而不是组合[1,5,7,8] 我知道有一个特殊的函数,但我想递归地做。有什么建议吗 nimed = [

从列表中创建元素组合时遇到问题

我想做的是在Python中创建一个递归函数,它返回元素的组合,例如list
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]等
而不是组合
[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) 
nime=[“A”、“B”、“C”、“D”、“E”、“F”、“G”、“H”]
def kombinatsioonid(listike,popitav):
如果len(listike)<4:
返回
tyhi=[]
对于范围内的c(len(listike)):
tyhi.append(listike[c])
listike.pop(popitav)
打印(tyhi)
kombinatsioonid(listike,popitav)
kombinatsioonid(尼米德,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)

对于
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
取消“打印”行的注释以查看发生了什么


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

你的输出和你想要的输出之间的区别是什么呢?例如,我没有得到像[a,E,G,H]这样的组合,或者上面[1,5,7,8]那样的组合仅仅使用它不是更好吗?这确实很好,但我是作为一个学校项目来做的,它特别要求我们不要使用itertools。这只是更大程序的一部分,但我目前仍停留在这一点上。“只是编辑”将您的forloop更改为:对于列表中的c:tyhi.append(c)感谢您的帮助,这是答案:)