2010-08-08 111 views
0

我在該論壇閱讀了很多,但我找不到合適的方式將所有項目添加到我的字典...所以也許有人可以幫助我! 首先解釋一下:將項目添加到詞典

rows = cur.fetchall() 
columns=[desc[0] for desc in cur.description] 
GID_Distances = {} 
if len(rows) > 0: 
    for row in rows: 
     items = zip(columns, row) 
     GID_Distances = {} 
     for (name, value) in items: 
     GID_Distances[name]=value 

行是一個sql語句列表。所以在這個列表中有幾個值具有相同的鍵...我只想得到像 這樣的東西: {['id':1,'point':2],['id':2 ,'point':3]} 但是對於上面的循環,結果只是最後一項,因爲它覆蓋了之前的所有內容。有任何想法嗎????

+3

在迭代它之前,不檢查列表的長度是否爲非空。這在迭代它時是隱含的。 – aaronasterling 2010-08-08 10:35:15

+1

如果'cur'是一個db上的遊標,那麼你應該接受Kenny的答案 – 2010-08-08 12:43:26

+0

,那麼可能有一種類似dict的遊標。 – 2010-08-08 18:10:59

回答

2

您正在重新定義GID_Distances到循環中的空白字典,而無需先存儲該值。排在列表中存儲像這樣:

rows = cur.fetchall() 
columns=[desc[0] for desc in cur.description] 
results = [] 
for row in rows: 
    GID_Distances = {} 
    items = zip(columns, row) 
    for (name, value) in items: 
    GID_Distances[name]=value 
    results.append(GID_Distances) 
+0

但發生此錯誤: NameError:全局名稱'GID_Distances'未定義 – aleho 2010-08-08 10:44:13

+1

那麼必須有一個輸入錯誤。沒有理由發生這種事情。例如,您正在訪問'columns'就好了,它在與'GID_Distances'相同的塊級定義。檢查你的拼寫在兩個地方都是一樣的。 – aaronasterling 2010-08-08 10:45:50

+0

不要認爲有錯字,因爲它是相同的代碼...我只是加了一個#... – aleho 2010-08-08 10:49:36

3

如果你有對即[(k1,v1),(k2,v2),...]的迭代,你可以申請dict它,使它的字典。因此,您的代碼可以簡寫爲

rows = cur.fetchall() 
columns = [desc[0] for desc in cur.description] 
# or: columns = list(map(operator.itemgetter(0), cur.description)) 
#  don't call list() in Python 2.x. 
GID_Distances = [dict(zip(columns, row)) for row in rows] 
# note: use itertools.izip in Python 2.x 
+0

+1忘了字典 – aaronasterling 2010-08-08 11:41:42

+0

這工作完美!呃,這麼短...好極了! 所以,我會看看如果我可以繼續... ...必須改變,因爲我之前使用過字典! 感謝您的快速幫助,太棒了! – aleho 2010-08-08 11:46:09