2017-08-10 33 views
2

我有這樣的數據。Python元素總和和連續次數約束

a = [10, 11, 12, 13, 14] 
    b = [15, 16, 17, 18, 19] 
    c = [20, 21, 22, 23, 24] 
  1. 我要檢查是否每一個列表中的第i個元素的總和,即,逐元素總和加起來大於50,其中i = [0,1,2,3, 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?

我知道我可以使用lambda函數來做到這一點,但如果可能的話,我想使用CSP庫,因爲稍後可能會有更多的約束條件,並且列表數量和每個列表中的元素數量可能會增加到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':* index *。 –

+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