[英]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 j
中f(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.