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



所以我很难解决以下问题:

给定一个数组的大小,比如说为了问题的方便,大小=20

它用零填充,如下所示arr=[0]*20=>[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

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

我有一本字典:key=索引的样本大小value=重复多次。

对于上面的例子:{3:2,2:1,4:1}

我希望函数返回索引列表=0

对于这个例子:[0,x,x

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

所以我请了一位同事帮忙,我们找到了一个解决方案:

我举了一个例子:下午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))

最新更新