2010-05-17 40 views
0

我在MySql DB中有一個表,我想將它加載到Python中的字典中。 表列如下:在Python中將數據庫表加載到嵌套字典中

id,url,tag,tagCount 

tagCount就是一個標籤已經被重複了某些網址的次數。所以在這種情況下,我需要一個嵌套字典,換句話說就是字典字典,來加載這個表格。因爲每個網址有幾個標籤,其中有,我用不同的tagCounts.the代碼是這樣的:(全表約22000條記錄)

cursor.execute(''' SELECT url,tag,tagCount 
        FROM wtp ''') 

urlTagCount = cursor.fetchall() 

d = defaultdict(defaultdict) 

for url,tag,tagCount in urlTagCount: 
    d[url][tag]=tagCount 

print d 

首先我想知道這是否是正確的..如果這是爲什麼需要這麼多時間?有沒有更快的解決方案?我將此表加載到內存中以快速訪問,以擺脫數據庫操作緩慢的麻煩,但由於速度慢,它本身已成爲瓶頸,它甚至比數據庫訪問慢得多。和任何人幫助?感謝

+0

我試了一個小例子,它似乎工作。你提到它需要很長時間,它有多長時間?否則結果看起來是否正確?其次是22,000條記錄,你的「打印d」輸出將是巨大的。你可能不喜歡在你的口譯員那裏嘗試。 – 2010-05-17 22:52:05

回答

0

我可以想辦法驗證代碼,並且工作正常。對於像我這樣的業餘愛好者,我建議不要試圖「打印」一個非常大的嵌套字典。代碼最後一行的「打印d」是緩慢的問題。如果將其刪除或嘗試使用實際的密鑰訪問字典,則速度非常快。

1

也許你可以用普通類型的字典和元組鍵嘗試像

d = dict() 

for url,tag,tagCount in urlTagCount: 
    d[(url, tag)] = tagCount 
在任何情況下

你嘗試:

d = defaultdict(dict) 

,而不是

d = defaultdict(defaultdict) 
1

您需要確保字典(以及每個嵌套字典)存在,然後再爲其分配鍵值。爲此,使用setdefault是有幫助的。你結束了這樣的事情:

d = {} 
for url, tag, tagCount in urlTagCount: 
    d.setdefault(url, {})[tag] = tagCount 
+0

我通常使用Python 2.4甚至Python 2.3,所以defaultdict對我來說是新的。我所給予的也會起作用,但問題中給出的版本對我來說似乎更加清楚。 – Pierce 2010-05-17 22:33:36