在python中分配数组(列表)算法排列

时间:2018-07-12 07:18:48

标签: python arrays algorithm itertools

所以我无法解决以下问题:

给定一个数组大小,为了便于说明,可以说size = 20

它用零填充,如下所示 arr = [0] * 20 ==> [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]

我们有几个恒定的样本大小,例如4,3,2

SampleA = 4,SampleB = 3,SampleC = 2

我需要对如何分配列表进行排列/变化。

我可以将每个样本放在不同的位置/索引

例如,sampleA = 4我可以将其放在0:3或1:4 ... 15:19的索引中。 (如您所见,有很多可能性)

一旦变得更加拥挤,事情就会变得复杂,例如:

3 + 2 + 3 +4

[0,x,x,x,0,0,x x,0,x,x,x,0,0,0,0,x,x,x,x]

我基本上需要的是找到全部分配样本的可能性,

我得到一本字典: 键=索引的样本大小,并且 value =重复多次。

上面的示例:{3:2,2:1,4:1}

,我希望该函数返回索引!= 0

的列表

对于此示例: [0,x,x,x,0,0,x x,0,x,x,x,0,0,0,0,x,x,x,x,x]

该函数将返回: list_ind = [0,5,6,9,13,14,15,16]

1 个答案:

答案 0 :(得分:0)

所以我请一位同事提供帮助,我们找到了解决方案:

我举了一个例子:  4:2,3:1,2:1

或口头上

两次4次,一次3次,一次2次 下面的代码:

*如果有人可以优化,那就太好了

size_of_wagon = 20
dct = {4:2,3:1,2:1}
l = [item for sublist in [[k] * v for (k, v) in dct.items()] for item in sublist]


def gen_func(lstOfSamples, length, shift):
    try:
        # print(f'lstOfSamples={lstOfSamples}')
        sample = lstOfSamples[0]  # Take first sample
        for i in range(length - sample):
            for x in gen_func(lstOfSamples[1:], length - (sample + i), shift + sample + i):
                yield [(shift + i, sample)] + x
    except:
        yield []


g = list(gen_func(l, size_of_wagon, 0))

for i in g:
    print(i)
print(len(g))