どうも、ちょげ(@chogetarou)です。
多次元のリスト(List)を1次元に変換する方法を紹介します。
方法

多次元のリスト(List)を1次元化する方法は、2つあります。
collections
ひとつは、collectionsを使う方法です。
まず、collectionsをインポートします。
import collections
次に、リストを引数で受け取る関数を定義します。
関数の処理で、リストをfor文でループします。
if文の条件式で、collections.abc.Iterableを使い、ループ変数がIterableか調べます。
また、ループ変数が文字列やバイトのようにループ可能な値かどうかも調べます。
ループ変数がIterableかつループ可能でない場合は、関数自身を呼び出します。
そして、Iterableでない、もしくは文字列やバイトのようにループ可能な値である場合は、ループ変数をそのまま返します。
#ls=対象のリスト
def flatten(ls):
for item in ls:
#ループ変数「item」がIterableもしくは文字列やループ可能な値かどうか調べる
if isinstance(item, collections.abc.Iterable) and not isinstance(item, (str, bytes)):
#ループ変数「item」がIterableもしくはループ可能でない値の場合は関数自身を呼び出す
yield from flatten(item)
else:
#Iterableでなくループ可能な値の場合は、ループ変数を返す
yield item
あとは、list()を呼び出し、list()の引数で定義した関数を呼び出します。
定義した関数の引数に、対象のリストを指定します。
#結果をリストとして取得
#ls=対象のリスト
result = list(flatten(ls))
上記のlist()は、多次元のリストを1次元化した結果を返します。
使用例
import collections
def flatten(ls):
for item in ls:
if isinstance(item, collections.abc.Iterable) and not isinstance(item, (str, bytes)):
yield from flatten(item)
else:
yield item
nums = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
result = list(flatten(nums))
print(nums)
print(result)
出力:
[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
numpy.ravel()
もうひとつは、numpy.ravel()を使う方法です。
まず、numpyをインポートします。
import numpy as np
次に、numpy.ravel()を呼び出します。
そして、numpy.ravel()の引数に、対象のリストを指定します。
#ls=対象のリスト
result = np.ravel(nums)
上記のlist()は、多次元のリストを1次元に変換した結果を返します。
使用例
import numpy as np
nums = [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
result = np.ravel(nums)
print(nums)
print(result)
出力:
[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]
[ 1 2 3 4 5 6 7 8 9 10 11 12]
まとめ
多次元のリスト(List)を1次元化する方法は、次の2つです。
- collectionsを使う方法
- np.ravel()を使う方法
result = np.ravel(nums)
コメント