1

ループ内の mysql fetchall 呼び出しから生成される次のようなタプルが与えられた場合...

tuple1 = (('doug', 6), ('fred', 9), ('garth', 3))
tuple2 = (('steve', 3), ('dan', 1))
tuple3 = (('alan', 5), ('tom', 8), ('bob', 3), ('joe', 8))

このように、各タプルを列全体としてテーブル (リストのリスト) に追加するにはどうすればよいですか?

table = [['doug',6,'steve',3,'alan',5],
         ['fred',9,'dan',1,'tom',8],
         ['garth',3,'',,'bob',3],
         ['',,'',,'joe',8]]
4

1 に答える 1

1

リストのサイズが異なるため、zip()ここでは役に立ちません。そのためzip、異なる長さのリストを受け入れ、不足している要素を で埋める独自の のような関数を実装する必要がありNoneます。

def transpose(lists):
   if not lists: return []
   return map(lambda *row: list(row), *lists)

次に、すべてのタプルを 1 つのリストにまとめます。

tuple1 = (('doug', 6), ('fred', 9), ('garth', 3))
tuple2 = (('steve', 3), ('dan', 1))
tuple3 = (('alan', 5), ('tom', 8), ('bob', 3), ('joe', 8))
tuples = [tuple1, tuple2, tuple3]

答えは簡単で、リスト内包表記で書かれています。

table = [[y for x in t for y in x or ['']] for t in transpose(tuples)]

結果は期待どおりです。

table
=> [['doug', 6, 'steve', 3, 'alan', 5],
    ['fred', 9, 'dan', 1, 'tom', 8],
    ['garth', 3, '', 'bob', 3],
    ['', '', 'joe', 8]]

コメントの質問について: 既存のテーブルに新しい列を追加する方法は? 方法は次のとおりです。

def addcolumn(table, column):
    tr = transpose([table, column])
    return [(x if x else []) + (list(y) if y else []) for x, y in tr]

例を続ける:

tuple4 = (('hewey', 1), ('dewey', 2), ('louie', 3))
addcolumn(table, tuple4)

=> [['doug', 6, 'steve', 3, 'alan', 5, 'hewey', 1],
    ['fred', 9, 'dan', 1, 'tom', 8, 'dewey', 2],
    ['garth', 3, '', 'bob', 3, 'louie', 3],
    ['', '', 'joe', 8]]
于 2013-09-19T16:04:18.900 に答える