创建具有所有组合的列表(给出最大值)

时间:2018-11-09 08:11:55

标签: python python-3.x algorithm

我目前正在研究K2算法,需要找出当前变量及其可能的父代的状态和值的所有组合。

例如给出了X1,X2和X3(当前变量)。 X1可以具有值{0,1,2,3},X2 {0,1}和X3 {0,1,2,3,4}。

因此,基本上,您可以创建一个可能的最大值列表:[3, 1, 4]

现在,我遇到的困难是创建一个返回所有可能组合的函数:

[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
[0, 0, 3]
[0, 1, 0]
[0, 1, 1]
[0, 2, 0]
...

列表的最大值和长度应该灵活。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

编写一个递归函数。我认为代码很容易解释。

l=[1, 3, 5, 2]
st=[]
def foo(index,l):
    if(index<len(l)):
        for i in range(l[index]+1):
            st.append(i)
            foo(index+1,l)
            st.pop()
    else:
            print(st)    
foo(0,l)

输出

[0, 0, 0, 0]
[0, 0, 0, 1]
[0, 0, 0, 2]
[0, 0, 1, 0]
[0, 0, 1, 1]
[0, 0, 1, 2]
.....
[1, 3, 5, 0]
[1, 3, 5, 1]
[1, 3, 5, 2]

答案 1 :(得分:0)

这是另一个递归实现:

def count(maxValsArr):
    # Base case: count all numbers for the last digit
    if len(maxValsArr) == 1:
        return [[x] for x in range(maxValsArr[0] + 1)]

    # Count all numbers from the current digit by incrementing this digit
    # and recursively incrementing later digits
    rtn = []
    for digitVal in range(maxValsArr[0] + 1):
        numbersToRight = count(maxValsArr[1:])
        numbers = [[digitVal] + x for x in numbersToRight]
        rtn = rtn + numbers
    return rtn

count([1, 1, 1])的输出为[[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]]