2021年9月20日月曜日

【リスト】多次元リストの一次元リストへの変換

 sumリストの次元をコピーする場合、そのやり方によってコピー元・先のオブジェクトが束縛される場合と別のオブジェクトとなる場合があり注意が必要。代入演算子で複製すると参照渡しとなり同じメモリ領域を参照するためコピー先のオブジェクトがコピー元のオブジェクトの値に影響される。コピー先のオブジェクトをコピー元のオブジェクトとリンクさせたくない場合はcopy()メソッドやcopyモジュールを使う、スライスによりコピーする等が必要となる。


1. sumによる一次元リストへの変換

 要素の合計を求めるsumの書式は以下。要素が数字のリストやタプルなどのイテラブルオブジェクトを左から右にstartに加算する。

sum(iterable, /, start=0)

startに空のリスト[]を設定し、iterableに二次元リストを設定すると空のリストに二次元リストの要素である一次元リストが加えられ、結果として一次元リストに変換される。

a = [[2, 4], [7, 9]]
print(sum(a, []))

実行結果

[2, 4, 7, 9]


 変換元のリストが三次元リストの場合は二次元リストに変換される。

a = [[[2, 4], [7, 9]]]
print(sum(a, []))

実行結果

[[2, 4], [7, 9]]


 三次元リストを一次元リストに変換する場合はsumを二重にすればよい。

a = [[[2, 4], [7, 9]]]
print(sum(sum(a, []), []))

実行結果

[2, 4, 7, 9]


2. itertools.chain.from_iterableによる一次元リストへの変換

 標準ライブラリitertoolsitertools.chain.from_iterableは一つのイテラブルから連鎖した入力を受け取る。二次元リストを引数に与えると一次元のイテレータを返す。戻り値がイテレータなのでlistでリストに変換する。
itertoolsを使うにはimportが必要。

import itertools

a = [[2, 4], [7, 9]]
print(list(itertools.chain.from_iterable(a)))

実行結果

[2, 4, 7, 9]


 三次元リストを一次元に変換する場合にはsumと同様に処理を二重にすればよい。

import itertools

a = [[[2, 4], [7, 9]]]
print(list(itertools.chain.from_iterable
          (itertools.chain.from_iterable(a))))

実行結果

[2, 4, 7, 9]


3. リファレンス

Python 標準ライブラリ > 組み込み関数 > sum()
Python 標準ライブラリ > itertools --- 効率的なループ実行のためのイテレータ生成関数 > classmethod chain.from_iterable(iterable)

使用バージョン:Python 3.8.8

0 件のコメント:

コメントを投稿