2013-07-20 7 views
5

私はPython(私の最初のPythonコード)を使って線形計画最適化モデルを書くことを試みているAMPLユーザーです。私は複合セットよりもインデックス付きのパラメータを宣言する方法を見つけようとしています。例えば、AMPLに、私は言う: は セットC PARAM X {A、B、C} のparam Y {A、B、C} のparam Z {A、B、C} セットBを設定します上記のセットとパラメータは、AMPLを介してデータベースから簡単に読み取ることができます。AMPLとPython - テーブル(多次元辞書)のインポート

データベースから読み込んだテーブルには、A、B、C、x、y、zの6つのフィールドがあります。そのうち3つは主キー(A、B、C)で、残り(x、y、z)は主キーで索引付けされた値です。

PYTHON PART: PYODBCモジュールを使用してSQL Serverに接続しています。私は "dict"を試しましたが、1つのキーだけにインデックスを付けることができます。 最初の3つのフィールドを複合セットとして宣言するためにどの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) 

あなたがこれを行うことができます(ABCの問題の場合はA、B、C = B、A、C、すなわちオーダー!):

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 

または(ABCのA、B、C == B、A、C、すなわち順序は重要ではない場合)あなたがこれを行うことができます:

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 =デスティネーション、C =プロダクト、d =コスト、e =ボリューム、f =量からデータを読み込んでいます。私は辞書としてデータを読み込んだ後、フィールド名を持つことができるようにして、セット(A、B、C)にインデックスを付け、パラメータ値(x、y、z)を検索して計算を行うことができます。 –