创建一个总和为给定数字的数字数组

时间:2012-03-07 07:35:53

标签: python

我一直在研究一些快速而肮脏的脚本,用于完成我的一些化学作业,其中一个遍历一个恒定长度的列表,其中所有元素总和为给定的常量。对于每一个,我检查他们是否符合一些额外的标准,并将其添加到另一个列表中。

我想出了一种符合总和标准的方法,但看起来很可怕,我确信这里有一些可教的时刻:

# iterate through all 11-element lists where the elements sum to 8.
for a in range(8+1):
 for b in range(8-a+1):
  for c in range(8-a-b+1):
   for d in range(8-a-b-c+1):
    for e in range(8-a-b-c-d+1):
     for f in range(8-a-b-c-d-e+1):
      for g in range(8-a-b-c-d-e-f+1):
       for h in range(8-a-b-c-d-e-f-g+1):
        for i in range(8-a-b-c-d-e-f-g-h+1):
         for j in range(8-a-b-c-d-e-f-g-h-i+1):
            k = 8-(a+b+c+d+e+f+g+h+i+j)
            x = [a,b,c,d,e,f,g,h,i,j,k]
            # see if x works for what I want

2 个答案:

答案 0 :(得分:1)

通用,递归解决方案:

def get_lists_with_sum(length, my_sum):
    if my_sum == 0:
        return [[0 for _ in range(length)]]

    if not length:
        return [[]]
    elif length == 1:
        return [[my_sum]]
    else:
        lists = []
        for i in range(my_sum+1):
            rest = my_sum - i
            sublists = get_lists_with_sum(length-1, rest)
            for sl in sublists:
                sl.insert(0, i)
                lists.append(sl)

    return lists

print get_lists_with_sum(11, 8)

答案 1 :(得分:1)

这是一个递归生成器,以字典顺序生成列表。将exact保留为True会得到所请求的结果,其中每个和= =限制;将exact设置为False会为所有列表提供0< = sum< = limit。递归利用此选项生成中间结果。

def lists_with_sum(length, limit, exact=True):
    if length:
        for l in lists_with_sum(length-1, limit, False):
            gap = limit-sum(l)
            for i in range(gap if exact else 0, gap+1):
                yield l + [i]
    else:
        yield []