2016-08-05 43 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 = ...行?它會讓我們更清楚你想要做什麼,而且無論如何它可能是正確的。