如何在Python中从SQLite3数据库查询构建DICT列表?

如何在Python中从SQLite3数据库查询构建DICT列表?,python,dictionary,sqlite,generator,list-comprehension,Python,Dictionary,Sqlite,Generator,List Comprehension,在Python 2.x中尝试从SQLite3查询生成dicts列表时,我可以执行以下操作: import sqlite3 cur = sqlite3.connect('filename.db').cursor() query = cur.execute('SELECT * FROM A_TABLE') colname = [ d[0] for d in query.description ] result_list = [] for r in query.fetchall(): row =

在Python 2.x中尝试从SQLite3查询生成
dict
s列表时,我可以执行以下操作:

import sqlite3
cur = sqlite3.connect('filename.db').cursor()
query = cur.execute('SELECT * FROM A_TABLE')
colname = [ d[0] for d in query.description ]
result_list = []
for r in query.fetchall():
  row = {}
  for i in range(len(colname)):
    row[colname[i]] = r[i]
  result_list.append(row)
  del row

cur.close()
cur.connection.close()
print result_list
通过这种方式,我尝试获得一个字典列表,每个键值对表示列名和为行分配的值


但是,尽管可以工作并且可以合理地理解,嵌套的for循环让我认为可能有一种Python习语可以简化这一点——特别是一些对理解的巧妙使用。我怀疑使用发电机是可能的,但我仍然不太明白如何使用它们。所以我问:有没有一种方法可以通过对生成器和/或dict的理解来“压缩”代码并获得预期的字典列表?

您可以用字典理解来替换内部for循环,如下所示:

row = dict((colname[i], r[i]) for i in range(len(colname)))
您还可以使用嵌套在列表理解中的字典理解替换整个内容:

result_list = [dict((colname[i], r[i]) for i in range(len(colname)) for r in query.fetchall()]
实际上,我可能会建议坚持使用外部for循环,因为这样看起来更具可读性。另外,在我看来,
del行
是不必要的。你不能仅仅依靠Python的垃圾收集器吗?

试试这个:

import sqlite3
cur = sqlite3.connect('filename.db').cursor()
query = cur.execute('SELECT * FROM A_TABLE')
colname = [ d[0] for d in query.description ]
result_list = [ dict(zip(colname, r)) for r in query.fetchall() ]
cur.close()
cur.connection.close()
print result_list

@大卫·K·赫斯是对的,只是有一个打字错误。第三行应改为:

query = cur.execute('SELECT * FROM A_TABLE')

我只能编辑三个字符,而且没有评论的声誉。

编辑了。在这种情况下,如果你对我的答案发表评论,我会得到通知。不幸的是,如果添加了另一个答案,我不会得到通知。问题中的代码正是我所寻找的。我只是想说谢谢你把它贴出来,因为它帮了我很多忙!