使用列表理解进行求和

时间:2016-08-05 01:29:32

标签: python python-2.7 python-3.x z3py

我正在尝试执行以下操作:

list=[b_{i}{j}=SUMMATION(|d_{i}{j}| - |g_{j}{k}|)] or simply

list=[SUMMATION(|d_{i}{j}| - |g_{j}{k}|)]

对于这个使用列表理解我正在尝试以下:

d=Function ('d', IntSort(), IntSort(),RealSort())
g=Function ('g', IntSort(), IntSort(),RealSort())
b=Function ('b', IntSort(),RealSort())

drug=[d(i,j)==randint(1,5) for i in range (input) for j in range (input)]
gene=[g(i,j)==randint(1,5) for i in range (input) for j in range (input)]
benefit=[[[(b(i) == b(i) + abs(d(i)(j)) - abs(g(j)(k))) for k in range(j) ] for j in range(i) ] for i in range(input) ]

但我收到以下错误我认为我的列表理解错误,因为我收到以下错误,有任何建议吗?

Traceback (most recent call last):
File "test.py", line 28, in <module>
benifit=[ [[(b(i)== b(i)+abs(d(i,j)) - abs(g(j)(k)))   for k in  range(j)]  for j in  range(i)]  for i in range(input) ]
TypeError: 'int' object is not iterable

任何帮助?

3 个答案:

答案 0 :(得分:1)

我目前还不相信您的代码正在按照您的想法行事。但是,我不熟悉z3py,所以我可能会在这里弄错。

首先,看一下这个片段。

d=Function ('d', IntSort(), IntSort(),RealSort())

我认为Function是由z3py定义的可调用,它产生另一个可调用的。

d(i,j)==randint(1,5)

在此代码段中,您使用两个参数调用函数d,然后将其与随机数进行比较。您似乎可能认为您将值分配给名为d的方阵;也许我错了。无论哪种方式,除非以某种方式调用d修改状态,否则你可能有1/5的机会成为真,否则为假。 (或者,如果您希望调用d生成1,2,3,4或5之外的值,则分布将不同)。

无论如何,该行用变量data填充一个布尔列表,其长度是input值的平方。

d[i][j]

这个片段让我想到了上述内容。这是索引列表列表的经典方法。

b(i) == b(i) + abs(d[i][j]) - abs(g[j][k])

这对我很怀疑。除非你以某种方式覆盖了相等运算符,否则这也会产生一个布尔值。此外,除非调用函数b修改状态或以其他方式返回相同参数的不同结果,否则它严格等同于bool(abs(d[i][j]) - abs(g[j][k]))。这是让我觉得您可能会将等效性检查与作业混淆的混乱。结果是benefit也将是一个布尔列表。

作为最后一点,我认为良好的风格会决定你将你最后的理解内化为简化。

benefit=[[[(b(i) == b(i) + abs(d[i][j]) - abs(g[j][k])) for k in range(j) ] for j in range(i) ] for i in range(input) ]

应改为阅读

benefit=[(b(i) == b(i) + abs(d[i][j]) - abs(g[j][k])) for i in range(input) for j in range(i) for k in range(j)]

答案 1 :(得分:0)

我认为你想要的是

benefit=[[[(b(i) == b(i) + abs(d[i][j]) - abs(g[j][k])) for k in range(j) ] for j in range(i) ] for i in range(input) ]

您不能迭代整数变量,即运行f(k) for k in j,其中j是int无效。您必须创建一个可迭代对象来迭代f(k) for k in range(j)

答案 2 :(得分:0)

使用嵌套循环也可以完成任何你理解的事情(使用更多行)。我不能完全说出你想要完成的事情,并且还有一点怀疑,你真正想要做的事情并不是最好的列表理解。

您可以使用循环重新编写benefit = ...行吗?它会让我们更清楚你想做什么,反正可能是正确的事情。