我的数据如下所示。
a = [10, 11, 12, 13, 14] b = [15, 16, 17, 18, 19] c = [20, 21, 22, 23, 24]
- 我想检查每个列表中第i个元素的和,即按元素求和是否大于50,其中i = [0, 1, 2, 3, 4]。
- 我也想检查这个和是否连续三次大于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库,因为以后可能会有更多的约束,并且每个列表的数量和每个列表中的元素数量可能会达到数千。
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 groupbya = [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) > 50for 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