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 库,因为以后可能会有更多的约束,而且列表的数量和每个列表中的元素数量可能会达到 1000 个。

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)

我建议你调查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

最新更新