【问题标题】:Allocating array (list) algorithm permutations in python在python中分配数组(列表)算法排列
【发布时间】:2018-07-12 07:18:48
【问题描述】:

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

给定一个数组大小,为了方便问题大小=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]

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

我得到一本字典: key = 索引的样本大小,以及 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]

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

【问题讨论】:

  • 检查你的例子 - 这很奇怪......是否允许将两个样本设置在一起而不分离 0?展示你的尝试,直到大规模投票。
  • 我添加了一个解决方案。基本上,您可以将样本放在一起,例如:[0,0,0,x,x,x,x,y,y,y,y,0,0,0,z,z,z,0,w, w,w,w,0]

标签: python arrays algorithm itertools


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-16
    相关资源
    最近更新 更多