[Python3] リスト内包表記の使い方

Posted on 2019/03/04 in programming , Updated on: 2019/03/30

はじめに

リスト内包表記(英: List Comprehension)を利用すると、 繰り返しや一定条件を満たす連続要素で構成されるリストを簡単に作成できる。
リスト内包表記を使用しない場合と、使用する場合でいくつかの例を示します。

リスト内包表記の書き方

[  for 繰り返し変数 in シーケンス ]

for 文

要素が 1~10 のリストを作成する。リスト内包表記を使わない場合。
まず空のリストを作ってから、For文を回して 1~10 の要素をひとつづつ .append()で追加している。

test_list1 = []
for x in range(1, 11):
    test_list1.append(x)

test_list1
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

リスト内包表記

test_list2 = [x for x in range(1, 11)]

test_list2
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

内包表記を使うことで、1行でシンプルにリスト作成を実行できる。 内包表記の記述方法も、通常の For文を理解していれば、容易に理解できる。


少し応用

test_list1 = []
for x in range(10):
    test_list1.append(x**2)

test_list1
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]


test_list2 = [x**2 for x in range(10)]

test_list2
# [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

for 文 + If 文

forとifの組み合わせも可能。

[  for 繰り返し変数 in シーケンス if 条件式]

この例では、0~9の要素のうち2で割り切れる(%2==0)要素、つまり偶数のみを取り出し、その数字の2乗のみで構成されるリストを作成する。

test_list1 = []
for x in range(10):
    if x%2 == 0:
        test_list1.append(x**2)

test_list1
# [0, 4, 16, 36, 64]

リスト内包表記

test_list2 = [x**2 for x in range(10) if x%2==0]

test_list2
# [0, 4, 16, 36, 64]

これも直感的でわかりやすい書き方になる。同様のやり方でどんどん条件式を追加することが可能。 ただし、一行で書くという性質上あまり条件を複雑にしすぎると、逆にわかりにくくなってしまうので注意が必要。

その他

リストを渡す 1

シーケンスにリストを渡して、要素をitemとして取り出し、処理をする。

list1 = [1,3,5]

list2 = [item*3 for item in list1]
list2
# [3, 9, 15]

リストを渡す 2

文字列リストを渡して、それぞれの要素の1文字目を取り出す。

list1 = ['Hello', 'Python', 'and', 'World']

list2 = [word[0] for word in list1]
list2
# ['H', 'P', 'a', 'W']

文字列リストを渡して、それぞれの要素を大文字にする。(.upper()メソッド利用)

list1 = ['Hello', 'Python', 'and', 'World']

list2 = [word.upper() for word in list1]
list2
# ['HELLO', 'PYTHON', 'AND', 'WORLD']

関数を組み込む

# 渡された数字を3倍した値を返す double という関数を定義する
def double(x):
    return x*3

list2 = [double(x) for x in range(10)]
list2
# [0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

リストのリストを作成

list1 = [1, 3, 5]

list2 = [[x**2, x**3] for x in list1]
list2
# [[1, 1], [9, 27], [25, 125]]

最後に

初学者のうちは、リスト内包表記をわざわざ使おうと思わないかもしれませんが、後々これは本当に便利だと気付かれるとおもいます。