2016-11-21 5 views
0

私は多項式を扱っているので、ループする変数の和がある一定の値よりも小さい場合は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)を繰り返し処理できますか?

+0

範囲の間の依存関係を考えると、私は助けるために具体的なものはないと思います。 – AChampion

答えて

2

あなた自身で書くことができます。

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 
+0

+1私は本当に再帰的なアプローチが好きです。ユーザーフレンドリーなインターフェイスを維持するためにタプルを使用することもできます(わずかに高速)。 – stefan

1

機能的な方法のようなものになるだろう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) 
関連する問題