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

标签 python loops iteration python-itertools

我正在处理多项式并且必须执行一些操作,其中我的循环变量的总和低于某个常量 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

关于python - 在 Python 中迭代具有常量和的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40728546/

相关文章:

python - 字符串中隐藏的 unicode 字符集

python - Instagram 和 oAuth

recursion - 每个递归函数都可以重写为迭代函数吗?

c# - 为什么我们不能分配一个 foreach 迭代变量,而我们可以用访问器完全修改它?

python - Python 中的电话号码正则表达式 (Regex)

python - 我如何在 python 的 Windows 上安装 boto 库?

java - 如何跳过Java中的一个 block ?

c++ - 为什么 if 语句和变量声明比循环中的加法更快?

c - openMP 线程和迭代

jquery - 使用 Javascript (jQuery) 遍历所有文本区域