リストのリストを転置する 質問する

リストのリストを転置する 質問する

たとえば、次のようになります。

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 つあります。

  1. 署名ジップ:zip(*iterables)これは、zip任意の数の引数を想定しており、各引数は反復可能でなければならないことを意味します。例zip([1, 2], [3, 4], [5, 6]):
  2. 展開された引数リスト: 引数のシーケンスが与えられた場合args、の各要素が の個別の位置引数となるようにf(*args)が呼び出されます。fargsf
  3. 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])。残りは、結果がタプルのリストではなくリストのリストであることを確認するだけです。

おすすめ記事