Pythonでリストを作るとき、こんなコードを書いていませんか?
x = []
for i in range(11):
x.append(i)
動くし、読めば意味も分かる。でも、Pythonにはこれをたった1行で書ける魔法のような構文があります——それがリスト内包表記(list comprehension)です。
リスト内包表記をマスターすると、ループ処理を含むコードがぐっとスッキリ。OSSや技術ブログのサンプルコードもスラスラ読めるようになり、「Python中級者の書くコード」に一歩近づけます✨ 自分のコードに自信が持てるようになる感覚、ぜひ味わってみてください。
リスト内包表記とは、for文を使ってリストを簡単に1行で作るための書き方です。基本形はとてもシンプル。
[式 for 変数 in 繰り返しオブジェクト]
角かっこ [ ] の中に「どんな要素を入れたいか(式)」と「どこから持ってくるか(forループ)」を書くだけ。これだけで、新しいリストが一気に出来上がります🚀
大きく分けて、リスト内包表記には3つの書き方があります。一つずつ実例で見ていきましょう。
もっとも基本となるのが「繰り返しオブジェクトの全要素に同じ処理を適用する」パターンです。
# 普通のfor文版
x = []
for i in range(6):
x.append(i)
# リスト内包表記版(1行!)
x = [i for i in range(6)]
print(x) # [0, 1, 2, 3, 4, 5]
3行が1行に圧縮されました。それだけで読みやすさも保守性もグッとアップします💡
角かっこの中の「式」の部分に処理を書けば、要素を変換しながらリストを作れます。
# 全要素を1000倍する
y = [i * 1000 for i in range(6)]
print(y) # [0, 1000, 2000, 3000, 4000, 5000]
names = ["斎藤", "山田", "田中"]
# 全員に「さん」を付ける
result = [name + "さん" for name in names]
print(result) # ['斎藤さん', '山田さん', '田中さん']
繰り返しオブジェクトの部分は、range() でも、リストでも、タプルでも、文字列でも、なんでもOK。Pythonらしい柔軟さがここに凝縮されています🌟
「全要素じゃなくて、条件に合うものだけ取り出したい」というときに使うのが、後ろに if を付ける書き方です。
[式 for 変数 in 繰り返しオブジェクト if 条件式]
# 0〜10の中から偶数だけ
evens = [i for i in range(11) if i % 2 == 0]
print(evens) # [0, 2, 4, 6, 8, 10]
i % 2 == 0 という条件が True になる要素だけが新しいリストに入ります。同じように if i % 2 != 0 と書けば奇数だけのリストもサクッと作れますね。
foods = ["apple", "banana", "orange", "grape"]
# 「a」が含まれる文字列だけ抽出
with_a = [f for f in foods if "a" in f]
print(with_a) # ['apple', 'banana', 'orange', 'grape']
文字列に「ある文字が含まれているか」を in でチェックできるPythonの強みと、リスト内包表記の組み合わせは最強コンビ💪
「条件に合うときと合わないときで、入れる値そのものを変えたい」というときは、式の部分に三項演算子を使う書き方を覚えましょう。
[trueの値 if 条件式 else falseの値 for 変数 in 繰り返しオブジェクト]
if が「式の前」に来るのがポイント。条件付きの書き方(if が後ろ)とは位置が違うので要注意です⚠️
x2 = ["偶" if i % 2 == 0 else i for i in range(6)]
print(x2) # ['偶', 1, '偶', 3, '偶', 5]
条件によってリストの要素の中身を切り替えられるので、データ整形・前処理のときに大活躍します。
kanto = ["栃木", "東京", "埼玉", "茨城", "群馬", "神奈川"]
# 東京には「都」、それ以外には「県」を付ける
result = [(p + "都") if p == "東京" else (p + "県") for p in kanto]
print(result)
# ['栃木県', '東京都', '埼玉県', '茨城県', '群馬県', '神奈川県']
こんな処理を普通のfor文で書くと5〜6行は必要ですが、リスト内包表記なら1行。コードレビューでも「お、Pythonっぽいね」と言ってもらえるはずです✨
[式 for 変数 in 繰り返しオブジェクト] — 全要素に処理を適用[式 for 変数 in 繰り返しオブジェクト if 条件式] — 条件に合う要素だけ抽出[trueの値 if 条件 else falseの値 for 変数 in 繰り返しオブジェクト] — 条件で値を切り替え使う頻度は「基本形 > 条件付き > 三項演算子付き」という順になることが多いです。まずは基本形をしっかり手に馴染ませて、必要に応じて条件版・三項版に拡張していくのがスムーズな学習ステップです📈
リスト内包表記は「読めばわかる」だけでは身につきません。自分の手で何度も書き換えて、動作を目で確認することで初めて自分の道具になります。良書と快適な作業環境を揃えて、Python中級者への階段を一段ずつ上っていきましょう。
変数・リスト・for文・内包表記といった基礎を、図解とサンプルで丁寧に解説してくれる入門書。本稿の内容を体系的に補強したい方の最初の一冊にぴったりです。
「内包表記を3つ以上の式で複雑にしすぎるな」「内包表記とジェネレータ式を使い分けよ」など、リスト内包表記まわりのベストプラクティスが満載。Pythonらしい書き方を体得したい方の決定版です。
リスト内包表記の感覚は、NumPyやPandasのベクトル演算へとそのまま繋がります。データ分析の世界で「Pythonらしい書き方」を本格的に身につけたい方におすすめです。
リスト内包表記では [ ] や : を頻繁に打ち込みます。静音設計でバックライト付きのキーボードなら、夜の写経学習も気持ちよく続けられます。
左にエディタ、右にREPL(対話シェル)を並べておくと、リスト内包表記を一行ずつ試して結果を確かめる学習スタイルが超快適に。USB-C一本で接続できるモデルはノートPC学習者の強い味方です。
シンプルなリスト生成なら内包表記の方が読みやすいとされています。一方、複数行にわたる複雑な処理や、副作用(ファイル書き込みなど)が絡む処理は普通のfor文の方が安全。「3行を超えそうだな」と感じたらfor文に戻す判断が大事です👌
ポイントは「ifの位置で意味が変わる」こと。[式 for x in xs if 条件](条件で絞り込み)と [A if 条件 else B for x in xs](条件で値切替)は別物です。前者はelseなし、後者はelse必須、と覚えるのがおすすめです。
多くの場合、リスト内包表記の方が高速かつ読みやすいと言われています。map や filter は関数を引数として受け取るAPIに渡すときに本領を発揮するので、用途で使い分けましょう。
可能ですが、2階以上のネストは可読性が一気に落ちるので注意。[[i*j for j in range(3)] for i in range(3)] のように2次元配列を作る程度に留め、それ以上ならfor文に戻すのが無難です。
できます! {key: value for ...} で辞書内包表記、{x for ...} で集合内包表記が書けます。一度リスト内包表記をマスターすれば、芋づる式に他の構造もマスターできます🎉
Pythonのリスト内包表記は、for文によるリスト生成を1行で表現できる強力な構文です。基本形・条件付き・三項演算子付きの3パターンさえ押さえれば、ほぼすべての場面に対応できます。
頭で覚えようとせず、「とりあえずREPLで打ち込んで動かしてみる」のが最短ルート。[i for i in range(10)] から始めて、if を加え、三項演算子に挑戦……と段階的にステップアップしていけば、自然と手が覚えていきます。
気づけばあなたのコードからは x = [] と x.append() の3行ループが消え、スッキリした角かっこ一つで意図が伝わるようになっているはず。お気に入りの書籍と快適な作業環境を味方につけて、今日からPythonの「カッコいい書き方」を自分のものにしていきましょう📋🚀