Python逐元素求和和连续次数约束

Python element-wise sum and consecutive times constraint

我有这样的数据。

    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. 我也想连续3次判断和是否大于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