3

Python 2.x で SQLite3 クエリから s のリストを生成しようとすると、dict次のようなことができます。

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 に答える