2013-07-20 62 views
5

我是AMPL用戶,嘗試使用Python(我的第一個Python代碼)編寫線性編程優化模型。我試圖找到如何聲明覆合集上的索引參數。例如,在AMPL,我會說: 集A 組B 組C PARAM X {A,B,C} PARAMÿ{A,B,C} PARAMŽ{A,B,C} 上述設置和參數可以通過AMPL輕鬆從數據庫中讀取。AMPL與Python - 導入表(多維字典?)

我從數據庫中讀取的表格有六個字段,即A,B,C,x,y,z。其中三個是主鍵(A,B,C),其餘的(x,y,z)是通過主鍵索引的值。

PYTHON PART: 我正在使用PYODBC模塊與SQL Server連接。我嘗試了「字典」,但它只能索引一個鍵。 我不知道應該使用哪種python特性來將前三個字段聲明爲複合集,將x,y和z聲明爲通過複合集索引的值。

import pyodbc  
con = pyodbc.connect('Trusted_Connection=yes', driver = '{SQL Server Native Client 10.0}', server = 'Server', database='db') 
cur = con.cursor() 
cur.execute("execute dbo.SP @Param =%d" %Param) 
result = cur.fetchall() 
Comp_Key, x, y, z= dict((A, B, C, [x,y,z]) for A, B, C, x, y, z in result) 

當然這是不正確的。我想不出一個辦法來做到這一點。

請幫我:) 在此先感謝!

回答

2

作爲代替:

Comp_Key, x, y, z= dict((A, B, C, [x,y,z]) for A, B, C, x, y, z in result) 

你可以做到這一點(如A,B,C = B,A,C,即ABC事項的順序!):

final_result = dict(((A, B, C), [x, y, z]) for A, B, C, x, y, z in result) 

OR

final_result = {(A, B, C): [x, y, z] for A, B, C, x, y, z in result} # more readable than first one 

或者你可以做到這一點(如A,B,C == B,A,C,即ABC的順序並不重要):

final_result = dict((frozenset(A, B, C), [x, y, z]) for A, B, C, x, y, z in result) 

OR

final_result = {frozenset(A, B, C): [x, y, z] for A, B, C, x, y, z in result} # more readable than first one 
+0

感謝德布!非常感激!!我想知道的是,我應該在閱讀表格之前聲明這些集合和參數嗎?如果是,如何?或者我應該這樣做:'A,B,C,x,y,z = final_result'?我在這裏得到的是在我讀完它們之後如何分離集合和參數? –

+0

你不能在python中聲明任何東西(它是動態類型的)。如果你的表的行像'[(A,B,C,x,y,z),(D,E,F,u,v,w)...]'那麼final_result的值爲{{ A,B,C):[x,y,z],(D,E,F):[u,v,w] ...}',那你到底想問什麼? –

+0

讓我從一個例子開始。在我讀的數據表中,A =來源,B = Dest,C =產品,d =成本,e =體積,f =數量。我希望能夠在將數據作爲字典讀取之後獲得字段名稱,以便可以對集合(A,B,C)進行索引並檢索參數值(x,y,z)以進行計算。 –