Skip to main content
 首页 » 编程设计

python之在 Python 中迭代具有常量和的索引

2025年05月04日26exmyth

我正在处理多项式并且必须执行一些操作,其中我的循环变量的总和低于某个常量 d。 现在我有

for i in range(0, d): 
    for j in range(i, d): 
        for k in range(j, d): 

我觉得有点丑。 是否有一些功能,可能在 itertools 中,允许我迭代 for i, j, k in foo(d) ?

请您参考如下方法:

你可以自己写。这是 3 个变量的蛮力方法:

def constant_sum(s): 
    for i in range(s+1): 
        for j in range(s-i+1): 
            k = s - i - j 
            yield i,j,k 
 
def inferior_sum(s): 
    for i in range(s+1): 
        for j in range(s+1): 
            if i+j >= s: 
                break 
            for k in range(s+1): 
                if i+j+k < s: 
                    yield i,j,k 
                else: 
                    break 
 
for i,j,k in constant_sum(3): 
    print(i,j,k) 
print() 
for i,j,k in inferior_sum(3): 
    print(i,j,k) 

输出:

0 0 3 
0 1 2 
0 2 1 
0 3 0 
1 0 2 
1 1 1 
1 2 0 
2 0 1 
2 1 0 
3 0 0 
 
0 0 0 
0 0 1 
0 0 2 
0 1 0 
0 1 1 
0 2 0 
1 0 0 
1 0 1 
1 1 0 
2 0 0 

这里是递归版本,可以为任何总和做任意数量的变量(n)...轻微测试:

def constant_sum(n,s): 
    if n == 1: 
        yield [s] 
    else: 
        for i in range(s+1): 
            for r in constant_sum(n-1,s-i): 
                yield [i] + r 
 
def inferior_sum(n,s): 
    if n == 1: 
        for i in range(s): 
            yield [i] 
    else: 
        for i in range(s): 
            for r in inferior_sum(n-1,s-i): 
                yield [i] + r 
 
for x in constant_sum(3,3): 
    print(*x) 
print() 
for x in inferior_sum(3,3): 
    print(*x) 

输出:

0 0 3 
0 1 2 
0 2 1 
0 3 0 
1 0 2 
1 1 1 
1 2 0 
2 0 1 
2 1 0 
3 0 0 
 
0 0 0 
0 0 1 
0 0 2 
0 1 0 
0 1 1 
0 2 0 
1 0 0 
1 0 1 
1 1 0 
2 0 0