从n大小列表中的k大小的python组合(递归)

-1 python recursion combinations permutation

我需要一个递归函数,它可以替换给定列表和长度的所有可能的排列:

>>> rec_offspring(3,[2,3])
[[2, 2, 2], [3, 2, 2], [2, 3, 2], [3, 3, 2], [2, 2, 3], [3, 2, 3], [2, 3, 3], [3, 3, 3]]
Run Code Online (Sandbox Code Playgroud)

我找到了下面的代码,但它只给出了组合; 它不重复元素,如[222] [322]等.

def choose_sets(mylist,length):
    mylen = len(mylist)

    if length == 1:
        return [[i] for i in mylist]
    if length > mylen:
        return []

    ToRet = []
    for k in xrange(mylen): 
        if mylen - k + 1> length :
            for j in choose_sets(mylist[k+1:],length-1):
                New = [mylist[k]]
                New.extend(j)
                ToRet.append(New)
    return ToRet
print choose_sets([1,2,3,4,5],3)
Run Code Online (Sandbox Code Playgroud)

vrs*_*vrs 5

这被称为笛卡尔积.您可以使用itertools 模块:

>>> from itertools import product
>>> list(product([2,3], repeat=3))
[(2, 2, 2), (2, 2, 3), (2, 3, 2), (2, 3, 3), (3, 2, 2), (3, 2, 3), (3, 3, 2), (3, 3, 3)]
Run Code Online (Sandbox Code Playgroud)