私は多項式を扱っているので、ループする変数の和がある一定の値よりも小さい場合はd
の演算を実行する必要があります。 今私はPythonで一定の合計でインデックスを反復する
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)
を繰り返し処理できますか?
私は多項式を扱っているので、ループする変数の和がある一定の値よりも小さい場合はd
の演算を実行する必要があります。 今私はPythonで一定の合計でインデックスを反復する
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)
を繰り返し処理できますか?
あなた自身で書くことができます。
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)を行うことができます再帰バージョン(S)...です。ここ3つの変数に対するブルートフォース方法です:
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
+1私は本当に再帰的なアプローチが好きです。ユーザーフレンドリーなインターフェイスを維持するためにタプルを使用することもできます(わずかに高速)。 – stefan
機能的な方法のようなものになるだろうitertools /:
from itertools import product
inferior_sum3 = filter(lambda x: sum(x)<3, product(range(4),range(4),range(4)))
for permu in inferior_sum3:
print(permu)
出力:
(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)
範囲の間の依存関係を考えると、私は助けるために具体的なものはないと思います。 – AChampion