2013-07-20 8 views
5

Sono un utente AMPL che tenta di scrivere un modello di ottimizzazione della programmazione lineare utilizzando Python (il mio primo codice Python). Sto cercando di scoprire come dichiarare i parametri indicizzati rispetto ai set composti. Ad esempio, in AMPL, direi: Set A Set B Set C param x {A, B, C} param y {A, B, C} param z {A, B, C} I set e i parametri sopra indicati possono essere letti facilmente da un database tramite AMPL.AMPL vs. Python - Importazione di tabelle (dizionari multidimensionali?)

La tabella che ho letto dal database ha sei campi, cioè A, B, C, x, y, z. Tre di questi sono chiavi primarie (A, B, C) e il resto (x, y, z) sono valori indicizzati sulle chiavi primarie.

PARTE PYTHON: Sto utilizzando il modulo PYODBC per connettersi a SQL Server. Ho provato "dict" ma può indicizzare solo una chiave. Non sono sicuro di quale funzione python dovrei usare per dichiarare i primi tre campi come un insieme composto e x, y e z come valori indicizzati sul set composto.

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) 

Naturalmente non è corretto. Non riesco a pensare a un modo per farlo.

Please help me :) Grazie in anticipo!

risposta

2

Al posto di questo:

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

Si potrebbe fare questo (se A, B, C = B, A, C, vale a dire ordine di questioni ABC!):

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

O

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

Oppure si potrebbe fare questo (se A, B, C == B, A, C, vale a dire nell'ordine di ABC non importa):

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

O

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

Grazie Deb !! Molto apprezzato!! Quello che mi sto chiedendo è che dovrei dichiarare questi set e parametri prima di leggere la tabella? Se sì, come? O dovrei fare questo: 'A, B, C, x, y, z = final_result'? Quello che sto ottenendo qui è a Come posso separare set e parametri dopo averli letti? –

+0

Non è possibile dichiarare nulla in python (è digitato dinamicamente). E se il tuo tavolo ha una riga come '[(A, B, C, x, y, z), (D, E, F, u, v, w) ...]' allora il final_result avrebbe valore '{((A, B, C): [x, y, z], (D, E, F): [u, v, w] ...} ', quindi che cosa vuoi esattamente chiedere? –

+0

Lasciami iniziare con un esempio. Nella tabella di cui sto leggendo i dati, A = Origine, B = Destinazione, C = Prodotto, d = costo, e = volume, f = quantità. Voglio essere in grado di avere i nomi dei campi dopo aver letto i dati come dizionario in modo da poter indicizzare i set (A, B, C) e recuperare i valori dei parametri (x, y, z) per eseguire i calcoli. –