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

二重や三重の多重ループを使ったリストの作成をリスト内包表記を使って行う方法や二次元配列のようなリストをリスト内包表記を使って行う方法について解説します。リスト内包表記の基本的な使い方については「リスト内包表記を使ったリストの作成」を参照されてください。

(Last modified: )

リスト内包表記による多重ループの記述方法

リスト内包表記は次のような書式を使用しました。

mylist = [i for i in range(1, 6)]
print(mylist)

>> [1, 2, 3, 4, 5]

これは for 文を使って次のように記述した場合と同じです。

mylist = []
for i in range(1, 6):
    mylist.append(i)

print(mylist)

>> [1, 2, 3, 4, 5]

上記は一重のループでリストを作成しました。それでは二重ループを使って次のようにリストを作成したい場合を考えてみます。

mylist = []
for i in range(1, 4):
    for j in range(1, 3):
        mylist.append(i * 10 + j)

print(mylist)

>> [11, 12, 21, 22, 31, 32]

このような二重ループを使ったリストの作成をリスト内包表記を使って行う場合は次のように記述します。

mylist = [i * 10 + j for i in range(1, 4) for j in range(1, 3)]
print(mylist)

>> [11, 12, 21, 22, 31, 32]

最初の for 文でイテラブルオブジェクトから 1 つ要素を取り出したあと、次の for 文でイテラブルオブジェクトから要素を順に取り出し、式として指定した i * 10 + j に代入して要素をとして追加します。 2 つ目の for 文でイテラブルオブジェクトから要素をすべて取り出したら最初の for 文に戻り次の要素を取り出します。そして次の for 文でイテラブルオブジェクトから要素を順に取り出します。

同じように三重以上のループでもリスト内包表記を使って同じように記述することができます。

mylist = [i * 100 + j * 10 + k for i in range(1, 4) \
  for j in range(1, 3) for k in range(1, 3)]

print(mylist)

>> [111, 112, 121, 122, 211, 212, 221, 222, 311, 312, 321, 322]

※ リスト内包表記の部分が長いので改行しています。

リスト内包表記による二次元配列の記述方法

リスト内包表記を使って二次元配列のようなリストを作成することもできます。例として次のような二次元配列のリストを作成したい場合を考えてみます。

mylist = []
for i in range(1, 4):
    sublist = []
    for j in range(1,3):
        sublist.append(i * 10 + j)
    mylist.append(sublist)

print(mylist)

>> [[11, 12], [21, 22], [31, 32]]

このような二次元配列のようなリストの作成をリスト内包表記を使って行う場合は次のように記述します。

mylist = [[i * 10 + j for j in range(1, 3)] for i in range(1, 4)]
print(mylist)

>> [[11, 12], [21, 22], [31, 32]]

今回の場合は内部のリスト内包表記を使って作成したリストオブジェクトを外側のリスト内包表記で要素として追加する形になります。

-- --

多重ループを使ったリストの作成をリスト内包表記を使って行う方法や二次元配列のようなリストをリスト内包表記を使って行う方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。