【Python】リスト内包表記 – リストを加工して新たなリストを作成

みなさんこんにちは、ZeroTerasu(@ZeroTerasu)です。

今回は、pythonで使用されるリスト内包表記について解説します。

使いどころは、リストなどの複数要素のデータ集合体を取得した後、そのデータ1つずつに対して何かしら処理を加えて新たなリストを作成したい場合に有効です。

リスト内包表記の基本形 = [式 for 変数 in オブジェクト]

まずは簡単な内包表記の例を下記に掲載します。

list_conprehensions = [2*i for i in range(10)]
list_conprehensions

#実行結果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

上記の例では、下記のように「①for文 → ②数式処理+リストへ追加」 の流れで新たなリストが作成されています。

①for文range関数によって、変数 i に0-10までの連続整数を格納

②変数 i を用いた式によって算出された結果を新たなリストに追加していく。

また、上記の処理は、下記のように空リストを作成した後にfor文を使ってリストに要素を追加していくことでも同じ結果を得られます。

list_conprehensions = []

for i in range(10):
    list_conprehensions.append(2*i)

list_conprehensions

#実行結果
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

内包表記を用いた方がスマートに記述できることがお分かりいただけるかと思います。

if文によって条件分岐した内包表記 = [式 for 変数 in オブジェクト if 条件式]

ifで条件分岐させることも可能です。

通常通り、オブジェクトの各要素が変数に渡された後、条件式に合致する変数だけが式に渡されて処理されます。

odds_num = [i for i in range(10) if i % 2 == 1]
odds_num

①for文range関数によって、変数 i に0-10までの連続整数を格納

②変数 i の中で条件式を満たす i だけが式に渡される。

③変数 i を用いた式によって算出された結果を新たなリストに追加していく。

if~else文を用いた内包表記 = [式 if 条件式 else 式 for 変数 in オブジェクト]

elseを使いたいときは、if文をリスト内包表記の一番前に書く必要があります。

因みに、elifは無い様子です。。。

odds_num = [i if i % 2 == 1 else "偶数" for i in range(10)]
odds_num

# 実行結果
['偶数', 1, '偶数', 3, '偶数', 5, '偶数', 7, '偶数', 9]

多重ループを使ったリスト内包表記の作成

2重ループ3重ループを使ってリスト内包表記を作成することもできます。

list = [i+ 2*j for i in range(1,4) for j in range(1,4)]
list
#実行結果
[3, 5, 7, 4, 6, 8, 5, 7, 9]

#for文を用いる場合は下記のようになります。
list = []

for i in range(1,4):
    for j in range(1,4):
        list.append(i + j*2)
list
#実行結果
[3, 5, 7, 4, 6, 8, 5, 7, 9]

上記例では、まず i = 1 が代入されます。 i = 1 で固定されている間に、j = 1 ~ 3が各個代入されます。

すなわち、前のfor文から要素が一つ代入されて固定されている間に、後ろのfor文から各要素が全て代入されるようになっています。

辞書型内包表記

辞書型オブジェクトの生成にも内包表記が使用できます。

data = { i:i**2 for i in range(10) }

#{
#  0: 0,
#  1: 1,
#  2: 4,
#  3: 9,
#  4: 16,
#  5: 25,
#  6: 36,
#  7: 49,
#  8: 64,
#  9: 81
#}

コメント

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