脱!プログラミング入門

このブログではプログラミング入門後にさらに能力を伸ばすための援助ができるようにしたいです

Pythonのリスト内包表記を使いこなそう

 Pythonではプログラムの行数を削減する様々な工夫がなされています.その中の1つにリスト内包表記があります.リスト内包表記とはfor文を使ってリストに任意の複数の値を入れる処理をfor文を使わずに[]で囲った書き方のことを言います.リスト内包表記を使うことでプログラムの行数の削減と処理の高速化が可能となります.

Pythonのリスト内包表記

 Pythonのリスト内包表記の一例を次に示します.

list1 = []
for i in range(10):
    list1.append(i)

# 上のfor文と下のリスト内包表記は同じ処理

list1_comp = [ i for i in range(10) ]

この通り,for文を使って書く場合に3行を要した物をリスト内包表記を使えば1行で書くことができます.if文を含むfor文とif-else文を含むfor文のリスト内包表記は次のようになります.

# if文を含むfor文
list2 = []
for i in range(10):
    if i % 3 == 0:
        list2.append(i)

list2_comp = [ i for i in range(10) if i % 3 == 0 ]

#if-else文を含むfor文
list3 = []
for i in range(10):
    if i % 2 == 0:
        list3.append(i)
    else:
        list3.append(-i)

list3_comp = [ i if i % 2 == 0 else -i for i in range(10) ]

注意していただきたいのはif分だけならfor文の後ろに書くのですが,if-else文ではfor文の前に書く必要があります.さらにif-else文はかなり複雑で,どのような内容の処理であるかわかりづらくなっています.

リスト内包表記の欠点

 リスト内包表記は行数を少なくして処理速度を上げるかなり便利な物です.しかし,上記にある例より少し複雑な処理になると格段に複雑さが増し,処理を理解するのにかなり時間がかかるようになります.for文の内部にif-else if-else文を含むリスト内包表記を次に示します.

list3 = []
for i in range(100):
    if i % 2 == 0:
        list3.append(i)
    elif i % 3 == 0:
        list3.append(i * 0.1)
    else
        list3.append(-i)

list3_comp = [ i if i%2 == 0 else i*0.1 if i%3 == 0 else -i for i in range(100) ]

ご覧の通りぱっと見では全く理解できません.8行のコードを1行でまとめられたのは圧巻ですが,プログラムの理解度が著しく低下した代償はかなり大きいです.

 このように,無闇にリスト内包表記を使うのは危険です.リスト内包表記は各自利用制限を設けるべきだと思います.例えば,if-else文よりも複雑な条件分岐構造を含むfor文はリスト内包表記にしないようにするという決まりを自分の中で決めておけばいいと思います.

終わりに

 リスト内包表記は便利なものですが,プログラムの理解度を低下させるという欠点を持っています.その欠点に関しては自分の中で利用制限を設けると軽減できると考えております.単純なリスト内包表記は適度に使えばプログラムの行数を減らしつつプログラムの理解度が向上します.単純なリスト内包表記は積極的に使いましょう.