Pythonのリスト内包表記の使い方を解説!初心者にもわかる簡単な書き方
生徒
「Pythonで、あるルールにそってリストを作りたいときって、毎回for文を使うんですか?」
先生
「もちろんfor文でも作れますが、リスト内包表記という便利な書き方を使うと、たった1行でシンプルに書けますよ。」
生徒
「1行で書けるって便利そうですね!リスト内包表記ってどういうものなんですか?」
先生
「それでは、リスト内包表記の基本から一緒に学んでいきましょう!」
1. リスト内包表記とは?
リスト内包表記(英語では List Comprehension)とは、ルールにそった新しいリストを簡潔に作るための記法です。
普通の書き方だと、リストを作るのに数行必要ですが、リスト内包表記を使えば1行で完結します。
例えば、「1から5までの数字を2倍にして新しいリストに入れたい」とき、普通のfor文を使うと次のようになります。
result = []
for i in range(1, 6):
result.append(i * 2)
print(result)
[2, 4, 6, 8, 10]
これをリスト内包表記で書くと、次のように短くできます。
result = [i * 2 for i in range(1, 6)]
print(result)
[2, 4, 6, 8, 10]
見た目もスッキリしていて、とても読みやすいですね。
2. リスト内包表記の基本構文
リスト内包表記の書き方は、以下のようになります。
[式 for 変数 in データの集まり]
たとえば、[x * 2 for x in range(5)] なら、「0から4までの数を2倍してリストにする」という意味になります。
numbers = [x * 2 for x in range(5)]
print(numbers)
[0, 2, 4, 6, 8]
3. 条件付きリスト内包表記
リスト内包表記には、「条件」をつけて絞り込みをすることもできます。
構文は次のようになります。
[式 for 変数 in データの集まり if 条件]
例えば、「0から9までのうち偶数だけをリストにしたい」場合は次のように書きます。
even_numbers = [x for x in range(10) if x % 2 == 0]
print(even_numbers)
[0, 2, 4, 6, 8]
x % 2 == 0 というのは、「xを2で割ったときに余りが0、つまり偶数」という意味です。
4. 条件によって値を変える内包表記(if else)
リスト内包表記では、if else を使って「条件に応じて値を変える」こともできます。
構文は少し違って、以下のように書きます。
[式1 if 条件 else 式2 for 変数 in データ]
例えば、「1から5までの数で、偶数はそのまま、奇数は0にする」場合は次のようになります。
result = [x if x % 2 == 0 else 0 for x in range(1, 6)]
print(result)
[0, 2, 0, 4, 0]
5. リスト内包表記の応用:文字列を加工する
数字だけでなく、文字列にもリスト内包表記は使えます。たとえば、全ての文字を大文字に変換したいとき。
words = ["apple", "banana", "cherry"]
upper_words = [word.upper() for word in words]
print(upper_words)
['APPLE', 'BANANA', 'CHERRY']
upper()は文字列を大文字にするメソッドです。このように、データを一括で変換できるのもリスト内包表記の魅力です。
6. リスト内包表記とfor文の違い
リスト内包表記と普通のfor文は、結果は同じでも、書き方と読みやすさが大きく異なります。
簡単な処理なら内包表記で短く、複雑な処理ならfor文で丁寧に書くのがオススメです。
以下は同じ処理のfor文と内包表記の例です。
# for文
squares = []
for x in range(5):
squares.append(x * x)
# 内包表記
squares = [x * x for x in range(5)]
7. ネスト(入れ子)のリスト内包表記
リスト内包表記は、入れ子(ネスト)にすることで2重ループにも対応できます。ただし、読みやすさのために、あまり複雑にはしない方がいいです。
例として、2つのリストから組み合わせを作るコードを紹介します。
colors = ["赤", "青"]
objects = ["車", "家"]
result = [c + o for c in colors for o in objects]
print(result)
['赤車', '赤家', '青車', '青家']
8. リスト内包表記の注意点
リスト内包表記は便利ですが、無理に使いすぎると逆に読みにくくなることがあります。
また、長すぎたり複雑すぎたりすると、初心者には何をしているのか分かりにくくなってしまいます。
あくまでシンプルな処理に使うのがベストです。
まとめ
Pythonのリスト内包表記は、ひとつひとつの処理を丁寧に書くfor文と比べて、より簡潔で読みやすいコードを実現するための重要な書き方です。特に、データを加工したり絞り込んだりする場面では、同じ処理をたった一行で表現できるため、コード全体の見通しが良くなり、保守性が高まります。リストの要素を変換する場面や、条件を加えて特定の要素のみを抽出するケースでも威力を発揮し、Pythonの特徴である直感的で明快な書き方を活かすことができます。また、条件分岐を含む書き方を使用すれば、偶数と奇数で処理を変えたり、文字列の変換をまとめて行ったりと、さまざまな応用に対応できる柔軟性も持っています。
さらに、ネストした(入れ子の)リスト内包表記を使うことで複数のデータを組み合わせる処理も表現できますが、複雑になりすぎないよう注意することが大切です。初心者のうちはまず基本構文をしっかり理解し、どのような場面で使うのが適切かを判断できる力を身につけることが重要です。特に、データ加工・フィルタリング・変換といった処理は日常的に登場するため、リスト内包表記を知っているかどうかで作業効率に大きな差が出ます。実務でも頻繁に利用される基本テクニックなので、繰り返し練習して自然に使いこなせるようにしておくと、後々大きな力になります。
サンプルプログラム(まとめ用)
ここでは、記事内容の総復習として、複数の処理を組み合わせたサンプルを書いておきます。
# 1から20までの数字のうち
# 偶数は2倍、奇数は0に変換し
# さらにその中から10以上の値のみを抽出するリスト内包表記
result = [x * 2 for x in range(1, 21) if (x % 2 == 0 and x * 2 >= 10)]
print(result)
[10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40]
このコードでは、内包表記の「変換」「条件」「抽出」という三つの要素が組み合わさっています。Pythonの特徴であるシンプルさと柔軟さを同時に体験できる良い例となっており、さまざまな処理に応用できる構造になっています。
生徒
「今日学んだリスト内包表記って、思っていたよりも色々な場面で使えるんですね。短く書けるのに意味もわかりやすくて便利でした!」
先生
「そうですね。特にデータを加工したり条件で絞り込むときは、リスト内包表記がとても役に立ちます。Pythonらしい書き方なので、自然に使えるようになっておくと良いですよ。」
生徒
「ifや条件分岐も使えるから、複雑な処理にも応用できそうですね!」
先生
「その通りです。ただ、ネストをしすぎると読みにくくなるので、そこだけ注意してくださいね。読みやすさとわかりやすさを忘れずに使うのが大切です。」
生徒
「はい!まずは今日のサンプルコードを自分でも書き写して練習してみます!」