3

在尝试dict从 Python 2.x 中的 SQLite3 查询生成 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 习惯用法可以简化这一点——特别是对理解的一些巧妙使用。我怀疑可能会求助于生成器,但我仍然不太了解如何使用它们。所以我问:有没有办法通过对生成器和/或字典的理解来“压缩”代码并获得预期的字典列表?

4

3 回答 3

7

试试这个:

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
于 2012-12-06T01:26:20.800 回答
1

您可以用字典理解替换内部 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 row是不必要的。你不能只依赖 Python 的垃圾收集器吗?

于 2012-12-06T01:26:05.567 回答
1

@David K. Hess 是对的,只是有一个错字。第三行应为:

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

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

于 2014-12-15T02:54:33.120 回答