2014-10-01 75 views
1

我无法创建列表中元素的组合。使用递归创建列表组合

我想要做的是在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) 
+1

Waht是你的输出和你想要的输出之间的差异 – 2014-10-01 08:00:28

+0

好吧,例如,我没有得到[A,E,G,H]或类似[1,5,7,8] – charen 2014-10-01 08:03:04

+0

使用[itertools.permutations()](https://docs.python.org/2/library/itertools.html#itertools.permutations)不是更好吗? – 2014-10-01 08:04:42

回答

1

对于每个元素xa,产生从元素权给它的所有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 

取消对“打印”网上看到发生了什么事情。作为一个方面说明,最好使用英语变量和函数名称,只是为了互操作性(你的问题就是一个例子)。

+0

谢谢你的帮助,这是答案:) – charen 2014-10-01 10:46:09

2

这可以以这种方式来完成:

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)