将数据库表加载到Python中的嵌套字典中

0 投票
3 回答
951 浏览
提问于 2025-04-15 22:49

我在MySql数据库里有一个表格,我想把它加载到Python的字典里。这个表格的列如下:

id,url,tag,tagCount

tagCount是指某个网址的标签出现的次数。所以我需要一个嵌套字典,简单来说就是一个字典里面再放一个字典,来加载这个表格。因为每个网址都有多个标签,而这些标签的tagCount是不同的。我用的代码是这样的:(整个表格大约有22,000条记录)

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

首先,我想知道这样做是否正确。如果是的话,为什么会这么慢?有没有更快的解决方案?我把这个表格加载到内存中是为了快速访问,避免慢数据库操作带来的麻烦,但现在速度这么慢,反而成了瓶颈,甚至比数据库访问还慢。有没有人能帮忙?谢谢!

3 个回答

1

你需要确保字典(还有里面的每个嵌套字典)在你给它们赋值之前是存在的。为了这个目的,使用setdefault这个方法会很有帮助。这样你最终会得到类似下面的代码:

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

也许你可以试试用普通的字典和元组作为键,比如:

d = dict()

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

无论如何,你试过这个吗:

d = defaultdict(dict)

而不是这个:

d = defaultdict(defaultdict)
0

我成功地验证了代码,它运行得非常好。对于像我这样的初学者,我建议不要尝试“打印”一个非常大的嵌套字典。代码最后一行的“print d”就是导致它运行慢的原因。如果把它去掉,或者用实际的键去访问字典,那就会快很多。

撰写回答