1. ホーム
  2. パイソン

[解決済み】リストの転置

2022-03-28 19:53:33

質問

取ろう。

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)]

ありがとうございました。

解決方法は?

Python 3:

# 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 : zip(*iterables) これはつまり zip は任意の数の引数を期待し、各引数は反復可能でなければならない。例えば zip([1, 2], [3, 4], [5, 6]) .
  2. 解凍された引数リスト : 引数の列が与えられたとき args , f(*args) を呼び出します。 f の各要素が args の個別の位置引数です。 f .
  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]) . あとは、結果がタプルのリストではなく、リストのリストであることを確認するだけです。