我已经实现了一种创建字典列表的方法,但我想知道是否有更有效的方法(同时保留两个列表中的订单元素):
#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)
答案 0 :(得分:4)
你可以在这里使用列表理解;它在创建最终列表方面更有效率。迭代时不要使用.fetchall()
,不要使用tuple
作为变量名,并且不需要在每一行调用list
:
fields = [tup[0] for tup in querycurs.description]
dict_agriculture = [dict(zip(fields, row)) for row in querycurs]
答案 1 :(得分:2)
我正在使用sqlite。
在这种情况下,最有效的方法是将row_factory
设置为内置的Row
类型,它在C中实现,并且比Python中的任何等效代码都快。 / p>
例如......
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()
答案 2 :(得分:1)
如果我读得正确,你有一个查询游标,其中.description属性是一个元组列表,字段名称作为第一项。 然后,您想要读取行,使用元组中的行名称将每个行列表转换为行dict。
这可以通过列表理解来完成:
col_name_agriculture = [tuple[0] for tuple in querycurs.description]
dict_agriculture = [dict(zip(col_name_agriculture, row) for row in querycurs]
还要考虑如何使用最终列表 - 如果要按顺序使用,则可以在那里使用生成器表达式。