2016-08-05 44 views
0

我试图执行金额如下:求和使用列表综合

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 

任何帮助?

+0

对于j中的k和i中的i,j和i都是整数,您正尝试迭代int对象 – MONTYHS

回答

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)

+0

实际上,我使用的方式与我错误地粘贴旧列表的方式相同。但它仍然会抛出同样的错误。 – Rauf

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以外的值,则分配将不同)。

无论如何,该行使用长度为值为input的平方值的布尔值列表填充变量data

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

任何你可以用一个修真做也可以做(使用几行)与嵌套循环。我无法完全告诉你想要完成什么,也有一点怀疑,你实际上想要做的并不是最好的列表解析。

您是否可以使用循环重新编写benefit = ...行?它会让我们更清楚你想要做什么,而且无论如何它可能是正确的。