2013-07-20 11 views
5

Jestem użytkownikiem AMPL próbującym napisać model optymalizacji programowania liniowego przy pomocy Pythona (Mój pierwszy kod Pythona). Próbuję znaleźć sposób deklarowania indeksowanych parametrów w zestawach złożonych. Na przykład, w Ampl, by powiedzieć: zbiór A Set B zbiór C param X {a, b, c} param R {A, B, C} param z {A, B, C} Powyższe zestawy i parametry można łatwo odczytać z bazy danych poprzez AMPL.AMPL vs. Python - Importowanie tabel (słowniki wielowymiarowe?)

Tabela, którą odczytałem z bazy danych zawiera sześć pól, tj. A, B, C, x, y, z. Trzy z nich to klucze podstawowe (A, B, C), a pozostałe (x, y, z) są wartościami indeksowanymi w stosunku do kluczy podstawowych.

PYTHON CZĘŚĆ: Używam modułu PYODBC do łączenia się z SQL Server. Próbowałem "dyktować", ale może indeksować tylko jeden klucz. Nie jestem pewien, która funkcja Pythona powinien być używana do deklarowania pierwszych trzech pól jako zestawu złożonego i x, y oraz z jako wartości indeksowanych w zestawie złożonym.

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) 

Oczywiście, że nie jest prawidłowe. Nie mogę wymyślić, jak to zrobić.

Proszę, pomóżcie mi :) Z góry dziękujemy!

Odpowiedz

2

W miejscu tym:

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

Można to zrobić (jeśli A, B, C = B, A, C, czyli kolejność sprawach 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 

Albo można to zrobić (jeśli A, B, C == B, A, C, czyli kolejność ABC nie ma znaczenia):

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

LUB

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

Dzięki Deb !! Bardzo doceniane !! Zastanawiam się, czy powinienem zadeklarować te zestawy i parametry, zanim przeczytam tabelę? Jeśli tak, w jaki sposób? Czy powinienem to zrobić: "A, B, C, x, y, z = final_result"? Dostaję tutaj pytanie: Jak mogę odseparować zestawy i parametry po ich przeczytaniu? –

+0

Nie można zadeklarować niczego w pythonie (jest to wpisywane dynamicznie). A jeśli twój stół ma rząd taki jak '[(A, B, C, x, y, z), (D, E, F, u, v, w) ...]' to ostateczne_wybranie miałoby wartość '{(A, B, C): [x, y, z], (D, E, F): [u, v, w] ...} ", więc o co dokładnie chcesz zapytać? –

+0

Zacznę od przykładu. W tabeli, z której czytam dane, A = Źródło, B = Dest, C = Produkt, d = koszt, e = objętość, f = ilość. Chcę móc mieć nazwy pól po przeczytaniu danych jako słownika, dzięki czemu mogę indeksować zbiory (A, B, C) i pobierać wartości parametrów (x, y, z) w celu wykonania obliczeń. –