[Python]多次元のリストを1次元化するには?

python

どうも、ちょげ(@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)

コメント

タイトルとURLをコピーしました