たとえば、次のようになります。
l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
私が求めている結果は
r = [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
そしてそうではない
r = [(1, 4, 7), (2, 5, 8), (3, 6, 9)]
ベストアンサー1
Python3:
# short circuits at shortest nested list if table is jagged:
list(map(list, zip(*l)))
# discards no data if jagged and fills short nested lists with None
list(map(list, itertools.zip_longest(*l, fillvalue=None)))
Python 2:
map(list, zip(*l))
[[1, 4, 7], [2, 5, 8], [3, 6, 9]]
説明:
何が起こっているかを理解するために知っておく必要があることが 2 つあります。
- 署名ジップ:
zip(*iterables)
これは、zip
任意の数の引数を想定しており、各引数は反復可能でなければならないことを意味します。例zip([1, 2], [3, 4], [5, 6])
: - 展開された引数リスト: 引数のシーケンスが与えられた場合
args
、の各要素が の個別の位置引数となるようにf(*args)
が呼び出されます。f
args
f
itertools.zip_longest
ネストされたリストの要素数が同じ (同種) でない場合はデータを破棄せず、代わりに短いネストされたリストにデータを入力して、それらを zip で結合します。
質問からの入力に戻るとl = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
、zip(*l)
は と同等になりますzip([1, 2, 3], [4, 5, 6], [7, 8, 9])
。残りは、結果がタプルのリストではなくリストのリストであることを確認するだけです。