2

私はこのようなデータを持っています。Pythonの要素ごとの合計と連続する時間の制約

a = [10, 11, 12, 13, 14] 
    b = [15, 16, 17, 18, 19] 
    c = [20, 21, 22, 23, 24] 
  1. 私は= [0、1、2、3、私は、リストの各のi番目の要素の合計は、すなわち、要素ごとの合計が50を超えるまで追加かどうかを確認したいです4]。
  2. また、合計が50回以上連続しているかどうかをチェックしたいと思います。

これをpythonの制約充足問題として行う方法はありますか?

私はこのCSPモジュールを使って(https://labix.org/python-constraint)しようとしましたが、これはリストのすべての可能な値の組み合わせを出力しますが、要素ごとの合計を行いたいと思います。

from constraint import * 

    problem = Problem() 
    problem.addVariable("a", [10, 11, 12, 13, 14]) 
    problem.addVariable("b", [15, 16, 17, 18, 19]) 
    problem.addVariable('c', [20, 21, 22, 23, 24]) 

    problem.addConstraint(lambda a,b,c: a+b+c>50, ("a","b","c")) 

    for x in problem.getSolutions(): 
     print x 

結果(合計72件の答え)

{'a': 14, 'c': 24, 'b': 19} 
    {'a': 14, 'c': 23, 'b': 19} 
    {'a': 14, 'c': 22, 'b': 19} 
    . 
    . 
    . 
    {'a': 10, 'c': 24, 'b': 18} 
    {'a': 10, 'c': 24, 'b': 17} 

必要な答え:また

{'a': 12, 'c': 22, 'b': 17} 
    {'a': 13, 'c': 23, 'b': 18} 
    {'a': 14, 'c': 24, 'b': 19} 

、私は合計が大きいに行く回連続の数を確認するために、制約を追加するにはどうすればよいです50よりも?

私はラムダ関数を使ってこれを行うことができますが、できるだけ多くの制約がある可能性があり、リスト数と各リストの要素数が上がる可能性があるため、 〜1000s。

a = [10, 11, 12, 13, 14] 
    b = [15, 16, 17, 18, 19] 
    c = [20, 21, 22, 23, 24] 

    z = zip(a, b, c) 

    print map(lambda (x,y,z): x+y+z>50, z) 
+0

私はあなたが制約に容易に翻訳可能思われないよう、ここでは「連続して」の意味を理解しながら。 –

+0

追加変数 'i':3つの配列の*インデックス*を使用します。 –

+0

連続について:通常、制約プログラムのポイントは、解が生成される順序は考慮されません。優れたソルバは、最初のソリューションを生成する時間を最小限に抑えることを目的としているため、ソリューションは通常、無作為に生成されます。データベースと比較する:ほとんどのデータベースは、「ORDER BY」が指定されていない場合、検索順序を厳しく保証しません。 –

答えて

1

itertools.groupbyを調査することをおすすめします。たとえば、&の連続する列の合計が> 50になるようなコードがあります。

from itertools import groupby 

a = [10, 11, 12, 13, 14] 
b = [15, 16, 17, 18, 19] 
c = [20, 21, 22, 23, 24] 

data = [a, b, c] 

def keyfunc(t): 
    return sum(t) > 50 

for k, g in groupby(zip(*data), keyfunc): 
    if k: 
     g = list(g) 
     print(g, len(g)) 

出力

[(12, 17, 22), (13, 18, 23), (14, 19, 24)] 3 
関連する問題