【问题标题】:How to build a list of dicts from a SQLite3 database query in Python?如何从 Python 中的 SQLite3 数据库查询构建字典列表?
【发布时间】:2012-12-06 01:16:20
【问题描述】:

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

【问题讨论】:

  • 问题中的代码正是我想要的。只是想说谢谢你发布它,因为它帮助了我很多!

标签: python dictionary sqlite generator list-comprehension


【解决方案1】:

试试这个:

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

【讨论】:

    【解决方案2】:

    你可以像这样用字典推导替换内部的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 的垃圾收集器吗?

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 进行了编辑。在这种情况下,如果您对我的回答发表评论,我会收到通知。很遗憾,如果添加了其他答案,我不会收到通知。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2021-11-27
      • 2018-10-27
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      相关资源
      最近更新 更多