1

午後、次のコードを使用してデータベースから座席番号を取得しようとしています

        cur.execute("SELECT * FROM seats")
    while True:
        row = cur.fetchone()
        if row == None:
            break
        print row[0]

しかし、そうすると、次のように個々のレコードを1行に1つずつ出力します。

A1
A2
B3 etc..

しかし、次のように意味がある場合は、各行を同じ文字で印刷したい:

A1 A2 A3 A4 A5 A6 A7 A8
B1 B2 B3 B4 B5 B6 B7

しかし、私はそれをそのように得ることができないようですか?どうすればこれを行うことができますか?

4

1 に答える 1

2

itertools.groupby()ツールを使用します。

from itertools import groupby

for letter, rows in groupby(cur, key=lambda r: r[0][0]):
    print ' '.join([r[0] for r in rows])

このgroupby()関数は の各行をループしcur、最初の列の最初の文字を取得して、各(letter, rows)値のタプルを返します。rows値は別の iterable です。これをループして (たとえば、ループforを使用して)、その最初の文字を持つすべての行を一覧表示できます。

これは、すでにソートされている行に依存しています。行が最初の文字の間で交互になっている場合:

A1
A2
B1
B2
A3
A4

それらを別々のグループとして出力します:

A1 A2
B1 B2
A3 A4

ORDER BY firstcolumnname正しいグループ化を保証するために、クエリに順序付け命令を追加することをお勧めします。

これは、テスト データベースを作成したときに表示されるものです。

>>> cur.execute("SELECT * FROM seats ORDER BY code")
<sqlite3.Cursor object at 0x10b1a8730>
>>> for letter, rows in groupby(cur, key=lambda r: r[0][0]):
...     print ' '.join([r[0] for r in rows])
... 
A1 A2 A3 A4 A5 A6 A7 A8
B1 B2 B3 B4 B5 B6 B7 B8
C1 C2 C3 C4 C5 C6 C7 C8
于 2013-02-04T11:55:24.613 に答える