2013-07-20 6 views
5

Ich bin ein AMPL-Benutzer, der versucht, ein lineares Programmierungsoptimierungsmodell mit Python (Mein erster Python-Code) zu schreiben. Ich versuche zu finden, wie indizierte Parameter über Verbundmengen deklariert werden. Zum Beispiel in AMPL, würde ich sagen: ein Satz Sets B Sets C param x {A, B, C} param y {A, B, C} param z {A, B, C} Die obigen Sätze und Parameter können einfach über AMPL aus einer Datenbank gelesen werden.AMPL vs. Python - Importieren von Tabellen (mehrdimensionale Wörterbücher?)

Die Tabelle, die ich aus der Datenbank lese, hat sechs Felder, d. H. A, B, C, x, y, z. Drei von ihnen sind Primärschlüssel (A, B, C) und der Rest (x, y, z) sind Werte, die über die Primärschlüssel indiziert sind.

PYTHON TEIL: Ich benutze PYODBC-Modul, um mit SQL Server zu verbinden. Ich habe "dict" versucht, aber es kann nur über einen Schlüssel indexieren. Ich bin nicht sicher, welche Python-Funktion ich verwenden sollte, um die ersten drei Felder als eine zusammengesetzte Menge und x, y und z als Werte über die Verbundmenge indiziert zu deklarieren.

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) 

Natürlich ist es nicht korrekt. Ich kann nicht über einen Weg nachdenken, dies zu tun.

Bitte helfen Sie mir :) Vielen Dank im Voraus!

Antwort

2

Statt dem:

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

Sie könnten dies tun (wenn A, B, C = B, A, C, dh die Reihenfolge des ABC matters!):

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 

Oder Sie könnten dies tun (wenn A, B, C == B, A, C, dh die Reihenfolge des ABC spielt keine Rolle):

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

ODER

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

Dank Deb !! Sehr geschätzt !! Worüber ich mich wundere, ist, dass ich diese Sätze und Parameter erklären sollte, bevor ich die Tabelle lese? Wenn ja, wie? Oder sollte ich das tun: 'A, B, C, x, y, z = endgültiges_Ergebnis'? Worauf ich hier hinaus will, ist: Wie kann ich die Sets und Parameter nach dem Einlesen trennen? –

+0

Sie können nichts in Python deklarieren (es ist dynamisch typisiert). Und wenn Ihre Tabelle eine Zeile wie '[(A, B, C, x, y, z), (D, E, F, u, v, w) ...] hat, dann würde das final_result den Wert' {(A, B, C): [x, y, z], (D, E, F): [u, v, w] ...}, was genau willst du danach fragen? –

+0

Lassen Sie mich mit einem Beispiel beginnen. In der Tabelle, die ich die Daten lesen, ist A = Quelle, B = Ziel, C = Produkt, d = Kosten, e = Volumen, f = Menge. Ich möchte in der Lage sein, die Feldnamen zu haben, nachdem ich die Daten als ein Wörterbuch gelesen habe, so dass ich über die Sätze (A, B, C) indexieren und Parameterwerte (x, y, z) abrufen kann, um Berechnungen durchzuführen. –