2014-09-30 93 views
-1

我在使用python中的算法时遇到了问题。 我有一个4值的数组[a,b,c,d],这些是百分比,所以在任何给定的时间a + b + c + d = 1。我需要一个循环遍历所有可能的数字组合,步长为0.1。例如:循环搜索数组中的所有可能组合

[0,0,0,1] 
[0,0,0.1,0.9] 
[0,0.1,0.1,0.8] 
[0.1,0.1,0.1,0.7] 
..... 
[0.1,0.1,0.2,0.6] 
[0.1,0.1,0.3,0.5] 
.... 
[1,0,0,0] 

我创建了一个代码似乎溢出...任何帮助? TY我知道它的一个小白问题......

def frange(start, stop, step): 
    while start <= stop: 
     yield start 
     start += step 

def distribuir(p,array): 
    if len(array) == 3: 
     array.append(p) 
     print(Array) 
     return 
    for i in frange(0,1,0.1): 
     temp = [] 
     temp.append(array) 
     temp.append(i) 
     distribuir(p-i,temp) 
+0

那么,你有什么尝试?如果你不知道如何从“0.0”到“1.0”以0.1的步长循环,考虑如果你使用'range(10)'并将每个值乘以'0.1',会发生什么。一旦你有了,你应该知道如何写下一个循环(提示:如果第一个值是'0.4',那么下一个值只需要从'0.0'循环到'0.6'),然后下一个下一个。如果你遇到困难,你可以发布你的代码和你卡住的地方。 – abarnert 2014-09-30 00:09:46

+0

@abarnert:这是一个在Python中进行分区的实现。唯一的区别是缩放0.1。 – 2014-09-30 00:11:18

+0

@GregHewgill:但是这个问题是所有长度为4的分区,而不是长度为4,没有'0',并且处理'1,1,1,7'和'7,1,1,1'作为同一个分区,所有这些都与这里所需的输出不同。 – abarnert 2014-09-30 00:16:46

回答

0

了很多的优化空间一个天真的递归解决方案:

import itertools 

def possibilities(prefix, size, values, total):                                    
    if size == 0: 
     return [prefix] if sum(prefix) == total else [] 
    return itertools.chain(*map(
     lambda v: possibilities(prefix+[v], size-1, values, total), 
     values 
    )) 

例子:

list(
    map(
     lambda t: map(float, t), 
     possibilities(
      prefix=[], 
      size=3, 
      values=map(Decimal, ['0', '0.1', '0.2', '0.3']), 
      total=Decimal('0.4') 
     ) 
    ) 
)                    

输出:

[[0.0, 0.1, 0.3], 
[0.0, 0.2, 0.2], 
[0.0, 0.3, 0.1], 
[0.1, 0.0, 0.3], 
[0.1, 0.1, 0.2], 
[0.1, 0.2, 0.1], 
[0.1, 0.3, 0.0], 
[0.2, 0.0, 0.2], 
[0.2, 0.1, 0.1], 
[0.2, 0.2, 0.0], 
[0.3, 0.0, 0.1], 
[0.3, 0.1, 0.0]]