Pythonのリスト内包表記とは?Java経験者に向けたやさしい解説

こんにちは。ゆうせいです。

今回は 「Pythonのリスト内包表記」 について解説していきます。

Javaを学んできた方にとって、Pythonの書き方は最初かなりシンプルすぎて「えっ、これで動くの?」と驚くこともあるかもしれません。特に「リスト内包表記(List Comprehension)」は、慣れると非常に便利だけれど最初はちょっと取っつきにくい 機能です。

でも大丈夫!Javaでの経験を活かしながら、ステップ・バイ・ステップで説明していきます。


リスト内包表記とは?

まず名前が難しそうですが、**「for文でリストを作る処理を、1行で書くための書き方」**です。

たとえば、Javaでこんなコードを書いたことはありませんか?

List<Integer> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    list.add(i * i);
}

これは「0から9までの数値の2乗をリストに追加する処理」ですよね。

Pythonでこれをリスト内包表記で書くと、こんな感じになります。

squares = [i * i for i in range(10)]

どうですか?1行で同じことをやっているんです。


リスト内包表記の構文

基本形

Pythonのリスト内包表記の基本形はこのようになっています。

[式 for 変数 in イテラブル]


具体例を見てみましょう。

[i * 2 for i in range(5)]

これは「0〜4までの数値を2倍した結果をリストにする」という意味です。

結果はこうなります。

[0, 2, 4, 6, 8]

Javaとの比較

処理JavaのコードPythonのリスト内包表記
0〜4のリスト作成for (int i=0; i<5; i++) list.add(i);[i for i in range(5)]
偶数だけ取り出すif (i % 2 == 0) を使う[i for i in range(10) if i % 2 == 0]

条件付き内包表記

リスト内包表記の中に if文を組み込む こともできます!

例:偶数だけ取り出す

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

Javaでいうとこんな処理と同じです。

List<Integer> evens = new ArrayList<>();
for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) {
        evens.add(i);
    }
}

Pythonだと1行で書けるのが強みですね。


入れ子のfor文(ネスト)

Javaで2重のforループを使うことがありますよね。Pythonのリスト内包表記でもそれができます。

Javaの例

List<String> result = new ArrayList<>();
for (String color : colors) {
    for (String size : sizes) {
        result.add(color + size);
    }
}

Pythonのリスト内包表記

[color + size for color in colors for size in sizes]

for文が横並びになることに注意してください!


メリットとデメリット

メリット

  • コードが短くなる:1行でリストが作れる
  • 読みやすくなる:慣れると直感的に理解できる
  • 効率がよい:Pythonの内部で最適化されている

デメリット

  • 慣れるまで読みにくい:ネストや条件が増えると、逆に読みづらくなる
  • 複雑な処理には不向き:可読性が落ちるため、複雑なロジックは普通のfor文の方が安全

実際に手を動かしてみよう!

以下の課題に挑戦してみてください。

練習問題

  1. 1〜20のうち、3の倍数だけを取り出してリストにするリスト内包表記を書いてみましょう。
  2. 1〜10のうち、偶数なら「even」、奇数なら「odd」という文字列をリストにする処理を内包表記で書いてみてください。
  3. 二重ループを使って、「A1」「A2」…「C3」のような文字列を作ってリストにしてみましょう(['A', 'B', 'C'][1, 2, 3]を使います)。

まとめ:いつ使うべき?

Pythonのリスト内包表記は、「シンプルなリスト操作」にとても向いています。

ただし、「ネストが深い」「複雑な処理が入る」場合は、あえて普通のfor文を使う方が読みやすいです。

「コードが短いこと」より「読みやすさ」が大切。これはPythonの文化でもあります。


今後の学習の指針

  • タプル内包表記(実はリスト内包表記とほぼ同じ)
  • 集合(set)や辞書(dict)でも内包表記が使える!
  • ラムダ式(匿名関数)と組み合わせて使うとさらに便利
  • 内包表記のパフォーマンス比較(for文との実行時間差)

このあたりを順番に学んでいくと、Pythonらしいコードが自然と書けるようになります!

次は「辞書内包表記」についてもぜひ一緒に学んでみましょう!

セイ・コンサルティング・グループの新人エンジニア研修のメニューへのリンク

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。