リストのサイズが異なるため、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]]