我正在尝试执行以下操作:
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 :(得分: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 = ...
行吗?它会让我们更清楚你想做什么,反正可能是正确的事情。