Python入門トップページ


目次

  1. プログラミング言語
  2. Anaconda - Jupyter Notebook / JupyterLab の環境設定
  3. Python の基礎
  4. リスト,タプル,辞書,集合
  5. 再び Jupyter Notebook の操作
  6. Python の制御構文
  7. 関数
  8. 便利な関数など
  9. リストの内包表記
  10. 多次元リスト
  11. クラス
  12. 演習問題
  13. 雑多な情報

Python の基礎

リストの内包表記

内包表記

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 の方がさらに高速です

目次に戻る