Python ではリストや辞書の各要素に対して同じ処理を実行して新たなリストを生成するときに,for
ループを書く代わりに内包表記を使うことができます.たとえば,values
リストの各要素を3倍して新たな results
リストを生成する処理を for
ループを使って記述すると次のようになります.
リストを3倍する
values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
results = []
for v in values:
results.append(v * 3)
print(results)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
上の処理をリストの内包表記を使うと,次のように記述することができます.
リストを3倍する内包表記
values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
results = [v * 3 for v in values]
print(results)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
さらに,奇数だけ取り出して3倍するには,次のように書くと良いでしょう.
奇数だけを3倍する内包表記
values = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
results = [v * 3 for v in values if v % 2 == 1]
print(results)
[3, 9, 15, 21, 27]
次は,scores
という辞書に格納されたデータの個数をカウントします.内包表記を利用しなければ,次のようなプログラムが考えれられるでしょう.
データの個数をカウントする
scores = {
'Tanaka': [10, 20],
'Sato': [30, 40, 50, 60],
'Watanabe': [5, 25, 30]
}
cnt = 0
for _, values in scores.items(): # for values in scores.values(): でも可
cnt += len(values)
print(cnt)
9
これを内包表記で記述すると実質的に1行のコードにまとめることができます.
データの個数をカウントする内包表記
scores = {
'Tanaka': [10, 20],
'Sato': [30, 40, 50, 60],
'Watanabe': [5, 25, 30]
}
cnt = sum(len(score) for score in data.values())
print(cnt)
9
同じ辞書 scores
について今度は合計を計算します.内包表記を利用しない場合は次の2つの方法が考えられるでしょう.
データの合計を計算する
total = 0
for values in scores.values():
for value in values:
total += value
print(total)
270
データの合計を計算する
total = 0
for values in scores.values():
total += sum(values)
print(total)
270
これを内包表記で記述すると次のようになります.このプログラムでは辞書 scores
のすべての値をリストで取得し,それぞれのリスト内の値を順番に取り出しています.これらをすべて sum
関数で合計しています.
データの合計を計算する内包表記
total = sum(value for values in scores.values() for value in values)
print(total)
270
上のような内包表記を使う利点のひとつは,プログラムが短くなり読みやすくなること,もうひとつは,内包表記を使うことで処理速度が向上することです.実際に速くなるかどうかは,各自で試してみよう.ここで NumPy との比較も行っていますが,NumPy の方がさらに高速です.