1

我已经实现了一种创建字典列表的方法,但我想知道是否有更有效的方法来这样做(同时保留两个列表中的顺序元素):

#global variable
dict_agriculture = []

col_name_agriculture = [tuple[0] for tuple in querycurs.description]
rows_agriculture = querycurs.fetchall()
for row in rows_agriculture:
    dict1 = dict(zip(col_name_agriculture, list(row)))
    dict_agriculture.append(dict1)
4

3 回答 3

4

您可以在这里使用列表理解;它更有效地创建最终列表。不要.fetchall()在迭代时使用,不要tuple用作变量名,也不需要list在每一行上调用:

fields = [tup[0] for tup in querycurs.description]
dict_agriculture = [dict(zip(fields, row)) for row in querycurs]
于 2013-06-07T13:51:15.963 回答
2

我正在使用sqlite。

在这种情况下,最有效的方法是设置row_factory为内置Row类型,它在 C 中实现,并且比 Python 中的任何等效代码都快。

例如...

import sqlite3

con = sqlite3.connect(...)
con.row_factory = sqlite3.Row
# Now queries will return objects which act as both a tuple, and a dictionary,
# so you can just do...
querycurs = con.cursor()
querycurs.execute(...)
dict_agriculture = querycurs.fetchall()
于 2013-06-07T14:07:42.430 回答
1

如果我没看错,您有一个查询游标,其中 .description 属性是一个元组列表,其中字段名称作为第一项。然后,您想要读取行,使用元组中的行名称将每个行列表转换为行字典。

这可以通过列表理解来完成:

col_name_agriculture = [tuple[0] for tuple in querycurs.description]
dict_agriculture = [dict(zip(col_name_agriculture, row) for row in querycurs]

还要考虑如何使用最终列表 - 如果要按顺序使用生成器表达式,则可以在那里使用它。

于 2013-06-07T13:52:58.447 回答