我一直在做一些快速而肮脏的脚本来完成我的一些化学作业,其中一个遍历一个恒定长度的列表,其中所有元素总和为给定的常量.对于每一个,我检查他们是否符合一些额外的标准,并将其添加到另一个列表中.
我想出了一种符合总和标准的方法,但它看起来很可怕,我确信这里有一些可教的时刻:
# 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
Run Code Online (Sandbox Code Playgroud)
这是一个递归生成器,它按字典顺序生成列表。保留exactasTrue给出所请求的结果,其中每个 sum==limit;设置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 []
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |