列表中的所有6位数排列

时间:2014-02-27 16:47:03

标签: python list python-3.x recursion permutation

我正在编写一个程序,目标是获取一个数字列表并使用递归函数返回所有六个字母的组合(不导入函数为我做)。比如说,我的数字是“1 2 3 4 5 6 7 8 9”,输出将是:

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 8
1 2 3 4 5 9
1 2 3 4 6 7
1 2 3 4 6 8
1 2 3 4 6 9
1 2 3 4 7 8
... etcetera, all the way down to
4 5 6 7 8 9

我不是在寻找代码,坚持,只是在概念上推动正确的方向。到目前为止我所尝试的失败了,我已经把自己变成了一个合乎逻辑的车辙。

我已经包含了我之前使用过的代码,但它实际上并不是一个递归函数,只能用于6-8位数值。它非常混乱,我可以完全废弃它:

# Function prints all the possible 6-number combinations for a group of numbers
def lotto(constantnumbers, variablenumbers):
    # Base case: No more constant variables, or only 6 numbers to begin with
    if len(constantnumbers) == 0 or len(variablenumbers) == 0:    
        if len(constantnumbers) == 0:
            print(" ".join(variablenumbers[1:7]))
        else:
            print(" ".join(constantnumbers[0:6]))
        i = 6 - len(constantnumbers)
        outvars = variablenumbers[1:i + 1]
        if len(variablenumbers) > len(outvars) + 1:
            print(" ".join(constantnumbers + outvars))
            for index in range(len(outvars), 0, -1):
                outvars[index - 1] = variablenumbers[index + 1]
                print(" ".join(constantnumbers + outvars))
    else:
        i = 6 - len(constantnumbers)
        outvars = variablenumbers[1:i + 1]
        print(" ".join(constantnumbers + outvars))
        if len(variablenumbers) > len(outvars) + 1:
            for index in range(len(outvars), 0, -1):
                outvars[index - 1] = variablenumbers[index + 1]
                print(" ".join(constantnumbers + outvars))
        #Reiterates the function until there are no more constant numbers
        lotto(constantnumbers[0:-1], constantnumbers[-1:] + variablenumbers)

1 个答案:

答案 0 :(得分:4)

import itertools

for combo in itertools.combinations(range(1,10), 6):
    print(" ".join(str(c) for c in combo))

给出了

1 2 3 4 5 6
1 2 3 4 5 7
1 2 3 4 5 8
...
3 4 6 7 8 9
3 5 6 7 8 9
4 5 6 7 8 9

编辑:好的,这是一个递归定义:

def combinations(basis, howmany):
    for index in range(0, len(basis) - howmany + 1):
        if howmany == 1:
            yield [basis[index]]
        else:
            this, remainder = basis[index], basis[index+1:]
            for rest in combinations(remainder, howmany - 1):
                yield [this] + rest

<强> EDIT2:

基本案例:1项组合是任何基础项目。

归纳:N项组合是任何基础项加上剩余基础上的(N-1)项 - 组合。