繁体   English   中英

使用列表推导求和

[英]summation using List Comprehensions

我正在尝试执行以下总和:

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

有什么帮助吗?

我目前不确信您的代码正在执行您认为正在执行的操作。 但是,我不熟悉z3py,因此在这里我可能会误会。

首先,看看这个片段。

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

我假设Function是由z3py定义的可调用对象,它会生成另一个可调用对象。

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

在此代码段中,您要使用两个参数调用函数d,然后将其与随机数进行比较。 似乎您可能会认为您正在将值分配给名为d的方阵; 也许我错了。 无论哪种方式,除非调用d以某种方式修改状态,否则您也有五分之一的可能性为true,否则为false。 (或者,如果您期望调用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)]

我想你想要的是

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) ]

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

您可以通过嵌套循环来完成任何对理解的处理(使用更多行)。 我不能完全说出您要完成的工作,还有些怀疑您的实际意图不是用列表理解来最好地完成。

您是否可以仅使用循环来重新编写您的benefit = ...行? 它会让我们更清楚地知道您想做什么,反正这也许是正确的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM