Pythonでリスト内包表記を使ってループを簡潔に書く方法
生徒
「先生、Pythonでリストを作るときって、毎回for文を使わなきゃいけないんですか?」
先生
「いい質問ですね。実はPythonには、リスト内包表記という便利な書き方があるんですよ。ループをもっと短く、見やすく書けます。」
生徒
「それってどういう意味なんですか?初心者でも使えますか?」
先生
「もちろん。これから順番にリスト内包表記の基本から、実際の使い方まで丁寧に説明していきましょう!」
1. Pythonのリスト内包表記とは?
Pythonのリスト内包表記(list comprehension)とは、リストを短い書き方で作る方法のことです。通常のfor文を使った書き方よりも、シンプルで読みやすいのが特徴です。
例えば、「1から5までの数字をリストにしたい」という場合、普通のfor文だと次のように書きます。
numbers = []
for i in range(1, 6):
numbers.append(i)
print(numbers)
このコードでは、numbersというリストに1〜5までを1つずつ追加しています。ですが、リスト内包表記を使えば、たった1行で同じことができます。
numbers = [i for i in range(1, 6)]
print(numbers)
どちらのコードも、結果は同じです。
[1, 2, 3, 4, 5]
2. なぜリスト内包表記を使うのか?
リスト内包表記を使うメリットは次のとおりです。
- コードが短くなる(for文よりシンプル)
- 読みやすい(ひと目で何をしているかわかる)
- 初心者でも覚えやすいパターンになっている
ただし、慣れないうちは「?」と思うかもしれません。でも心配いりません。これからいろんな例を見ながら、ゆっくり覚えていきましょう。
3. リスト内包表記の基本構文
リスト内包表記の書き方は、次のような形です。
[変数 for 変数 in 繰り返しの対象]
この中で出てくる「for 変数 in ○○」という部分は、通常のfor文と同じ意味です。
つまり、「○○の中から1つずつ取り出して、変数に入れて、それをリストに追加する」という動きをしています。
4. 値を加工しながらリストを作る
リスト内包表記は、ただ値を取り出すだけでなく、取り出した値に計算や加工をしてからリストに入れることもできます。
例えば、「1から5までの数字を2倍したリスト」を作ってみましょう。
doubles = [i * 2 for i in range(1, 6)]
print(doubles)
[2, 4, 6, 8, 10]
i * 2の部分で、リストに入れる値を加工しています。
5. 条件付きのリスト内包表記
リスト内包表記では、条件付きで値を入れることもできます。例えば、「1から10までのうち、偶数だけを取り出したい」ときは、次のように書けます。
evens = [i for i in range(1, 11) if i % 2 == 0]
print(evens)
[2, 4, 6, 8, 10]
if i % 2 == 0の部分が条件です。%は「割ったあとの余り」を意味します。
6. 文字列を使ったリスト内包表記
リスト内包表記は、数字だけでなく文字列(文字の集まり)にも使えます。
例えば、「hello」という文字列の1文字ずつをリストにしてみましょう。
letters = [char for char in "hello"]
print(letters)
['h', 'e', 'l', 'l', 'o']
このように、文字列の1文字1文字を扱いたいときにも便利です。
7. ネスト(入れ子)のリスト内包表記
少し応用になりますが、2重のループを使ったリスト内包表記も可能です。
たとえば、「1〜3の数字と、'a'〜'c'の文字を組み合わせたい」場合です。
combinations = [str(i) + c for i in range(1, 4) for c in 'abc']
print(combinations)
['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']
このように、複雑な組み合わせを簡単にリスト化できます。
8. リスト内包表記と普通のfor文の違い
リスト内包表記は簡潔ですが、処理が複雑になりすぎると逆に読みにくくなることもあります。
次のような場合は、通常のfor文の方が良いかもしれません。
- 条件が複雑なとき
- リストではなく、他のことをしたいとき
- 説明やコメントを多く入れたいとき
使いどころを見極めて、リスト内包表記とfor文を上手に使い分けましょう。