【Python】リスト内包表記とは:リストから新しいリストを生成する

時計 2023.01.03 / 時計

【Python】リスト内包表記とは:リストから新しいリストを生成する

記事ではPythonにおける、リスト内包表記(list comprehension)について詳しく解説していきます。

リスト内包表記は既存のリストから新しいリストを生成する方法です。リスト内包表記を利用することでコードを簡潔にできます。

for文やif文を組み合わせて利用することで、既存のリストから様々な新しいリストを簡単に生成できます。

本記事を参考にして、リスト内包表記について理解を深めてください。

リスト内包表記

リストとは

Pythonで利用できるデータ型の一つにリストがあります。リストは複数の値を順番に格納できるデータ型です。

リストには次のような特徴があります。

リストの特徴
  • 複数の値を順番に格納する
  • 各要素にはインデックス番号が振られる
  • インデックス番号は0から始まる
  • イミュータブル(変更可能)なため、好きな箇所に要素を追加・削除ができる
  • 格納する要素は型が異なっても可

リストについてより詳しくは以下記事をご参照ください。

リストで使用できるメソッドは以下記事ですべて紹介しています。

リスト内包表記とは

リスト内包表記とは既存のリストから新しいリストを生成する手法です。

リスト内包表記を利用せずとも既存のリストから新しいリストを作成することはできますが、リスト内包表記を利用することでコードが簡潔に記述できます。また若干ですが速度も速くなります。

内包表記という手法はリスト以外にも集合や辞書にも利用されます。これらは集合内包表記や辞書内包表記と言われます。

リスト内包表記によるリストの生成方法

リスト内包表記は以下構文に従って利用します。

構文

[式 for 仮変数 in リスト]

リスト内包表記はfor文でリストの値(要素)を順に取り出し、式にその値を代入して計算し、結果を新たなリストに追加していきます。

上記構文の通り、リスト内包表記では必ずfor文による繰り返し処理を行います。またif文を組み合わせることでより柔軟に新しいリストを作成できるようになります。

以下に例として、既存のリストを2倍にして新しいリストを生成するコードを記します。

>>> lists = [5, 4, 54]
>>> lists2 = [i * 2 for i in lists]
>>> lists2
[10, 8, 108]

上記のリスト内包表記をfor文で表すと以下のようになります。

>>> lists = [5, 4, 54]
>>> lists2 = []
>>> for i in lists:
...     lists2.append(i * 2)
>>> lists2
[10, 8, 108]

このようにリスト内包表記を使うことでコードがシンプルに記述できることがわかります。リストをループさせて新しいリストを作成する場合、リスト内包表記で表現できないか検討してみてください。

if文の組み合わせたリスト内包表記

リスト内包表記はif文を組み合わせることができます。if文を利用することでリストから特定の条件を満たした要素のみを取り出して式に代入し、新しいリストを生成できます。

構文

[式 for 仮変数 in リスト if 条件式]

if文の条件式がTrueの場合のみ、要素の値が式に代入され、リストに結果が追加されます。

例えば既存のリストから、奇数の値のみを格納したリストを生成するには次のように記述します。

>>> lists = [5, 4, 54]
>>> lists2 = [i for i in lists if i % 2 == 1]
>>> lists2
[5]

リスト内包表記の使用用途

リスト内包表記の使用用途をいくつか下記に記します。

  • 連続した数値のリスト作成
  • リストの各要素を倍にする
  • リストの数値を文字列に変換
  • 特定の値(要素)のみを抽出したリストの生成
  • 2次元リストの子リストから要素数を求める

連続した数値のリスト作成

連続した数値のリストを作成する際は、リスト内包表記とrange関数を組み合わせることで簡単に作成できます。

>>> lists = [i for i in range(10)]
>>> lists
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

リストの各要素を倍にする

すでに例として解説していますが、リストの各要素を2倍、3倍、4倍としたい場合、リスト内包表記を利用することで簡単に記述できます。

>>> lists = [5, 4, 54]
>>> lists2 = [i * 4 for i in lists]
>>> lists2
[20, 16, 216]

リストの数値を文字列に変換

リストの要素が数値であり、すべて文字列に変換したい場合、以下のようにリスト内包表記を利用することができます。

>>> lists = [5, 4, 54]
>>> lists2 = [str(i) for i in lists]
>>> lists2
['5', '4', '54']

特定の値(要素)のみを抽出したリストの生成

既存のリストから特定の値(要素)のみを抽出したリストを生成する場合もリスト内包表記が便利です。

例えばリストから30以上の値だけを抽出したい場合は次のように記述します。

>>> lists = [5, 4, 54]
>>> lists2 = [i for i in lists if i > 30]
>>> lists2
[54]

上記のようにif文を組み合わせて、条件式に抽出したいリストの条件を記述するだけで、希望するリストを生成できます。

2次元リストの子リストから要素数を求める

2次元リスト(リストの要素がリスト)の子リストの要素数を求めたい場合、リスト内包表記を利用することで簡単に要素数を取得できます。

>>> lists = [['a', 'b', 'c'], ['d', 'e', 'f']]
>>> lists2 = [len(i) for i in lists]
>>> lists2
[3, 3]

上記のように、リスト内包表記とlen関数を組み合わせて要素数を求めます。