【Python】レッスン4-07:リストの内包表記を理解しよう

ながみえ
【Python学習記事のアイキャッチ画像】Lesson4-7 リストの内包表記を理解しよう

一つ前のLessonではリストのループ処理について学習しました。

今回はリストの内包表記について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:関数とスコープ編

Lesson4:データ構造編
・Lesson4-1:リストの定義と要素の追加を理解しよう
・Lesson4-2:リストの要素を削除しよう
・Lesson4-3:リストの情報を調べよう
・Lesson4-4:リストの集計・並べ替えを理解しよう
・Lesson4-5:リストのスライスを理解しよう
・Lesson4-6:リストのループ処理を理解しよう
・Lesson4-7:リストの内包表記を理解しよう ◁今回はココ
・Lesson4-8:リスト・タプル・辞書・集合の概要と違いを理解しよう
・Lesson4-9:タプルの基本を理解しよう
・Lesson4-10:タプルのアンパックを理解しよう
・Lesson4-11:辞書の基本を理解しよう
・Lesson4-12:辞書のループ処理を理解しよう
・Lesson4-13:辞書の内包表記を使ってリストから辞書を作ろう
・Lesson4-13:集合(セット)の基本を理解しよう
・練習問題4-1:宝探しゲームを作ろう
・練習問題4-2:ナインゲームを作ろう 
・練習問題4-3:マルバツゲームを作ろう
Lesson5:オブジェクト指向編
次のステップ:Python基礎習得者にお勧めの道5選(実務or副業)

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson4-6 リストのループ処理を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson4-8 データ構造の違いを理解しよう

一行で作るリスト:内包表記の基本と使いどころ

リストの内包表記は、新しいリストを一行で生成できる記法です。

本記事では、基本の書き方と読み方、for/if の組み合わせ方、可読性を保つコツなどを“初心者向け”に整理します。

この記法を身につけると、要素の変換(平方・文字列加工)や条件による抽出(フィルタ)、入れ子データの平坦化など、日常的な処理を短く・意図が伝わる形で書けるようになります。

冗長なループを書かずに済むため、コードレビューや保守もスムーズになります。

読み終えるころには、内包表記を迷わず選べる・安全に使い分けられるはずです。まずは基本のパターンから見ていきましょう。

【Python】勉強猫がノートパソコンを前にして学習を始める様子。記事内の学習スタート用イラスト

リストの内包表記の基本構文と使用例

リストの内包表記は既存のリストから新しいリストを作成するための簡潔な構文で、通常はforループを使って行うリストの生成を1行で行う方法です。

基本的な構文は以下の通りです。

新しい変数 = [処理 ループ内容]	# リスト内包表記の構文

例えば既存リスト内のすべての要素を2乗した新しいリストを作る場合で、従来のforループを使った書き方とリストの内包表記を使った書き方を比較してみましょう。

従来のforループを使ったリスト生成例

numbers = [1, 2, 3, 4, 5]	# 既存リストを作成
squared_numbers = []		# 空の新リストを作成

for number in numbers:
    squared_numbers.append(number ** 2)	# 空の新リストにappend()メソッドで要素を追加
    
print(squared_numbers)		# 完成した新リストを出力

このコードではforループを使ってnumbersリストの各要素を順番に取り出し、その2乗を新しいリストsquared_numbersに追加しています。

一方リストの内包表記を使うと、同じ処理を次のように1行で書くことができます。

リストの内包表記を使ったリスト生成例

numbers = [1, 2, 3, 4, 5]	# 既存リストを作成
squared_numbers = [number ** 2 for number in numbers]	# 内包表記で新リストを作成
	# 新しい変数 = [処理 ループ内容]
  
print(squared_numbers)	# 完成した新リストを出力

2行目でリストの内包表記が使われています。

リストの内包表記を使うことでより簡潔にコードを書くことができ、処理の流れが一目でわかるようになります。

[2, 4, 6, 8, 10]

リストの内包表記を使用したサンプルコード

リストの内包表記はシンプルなリストの生成だけでなく、複雑な操作にも対応できます。

ここではいくつかの具体例を見ていきましょう。

条件付きリストの内包表記

内包表記には条件を追加することも可能です。

新しい変数 = [処理 ループ内容 条件]

例えばリストの中から偶数だけを取り出して新しいリストを作成する場合、次のように書くことができます。

numbers = [1, 2, 3, 4, 5, 6]
even_numbers = [number for number in numbers if number % 2 == 0]
 # 新しい変数 = [処理 ループ内容 条件]

print(even_numbers)

このコードを実行すると以下のように出力されます。

[2, 4, 6]

この例ではif文を使ってリスト内の要素が偶数の場合だけ新しいリストeven_numbersに追加しています。

これにより条件付きでリストを作成することができます。

二重ループを使ったリストの内包表記

例えば二次元リストのようなデータを扱う場合、二重ループを使った内包表記を使用することができます。

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 2次元リスト
flattened = [num for row in matrix for num in row]
	# [処理(変数num) ループ内容(変数rowをmatrixの中でループ) 条件(変数numをrowの中でループ)]
	# [処理(変数num) ループ内容(1週目[1, 2, 3]) 条件(変数numに1, 2, 3を順に代入)]
	# [処理(変数num) ループ内容(2周目[4, 5, 6]) 条件(変数numに4, 5, 6を順に代入)]
	# [処理(変数num) ループ内容(3周目[7, 8, 9]) 条件(変数numに7, 8, 9を順に代入)]

print(flattened)

このコードを実行すると以下のように出力されます。

[1, 2, 3, 4, 5, 6, 7, 8, 9]

このコードではmatrixという二次元リストから要素を1つずつ取り出して平坦なリストflattenedを作成しています。

リストの内包表記を使うことで、複雑なデータ構造も簡単に扱うことができます。

まとめ|一行で読みやすいリスト生成

リストの内包表記はPythonの強力な機能の一つで、リストを簡潔かつ効率的に生成することができます。

シンプルな構文でリスト操作を行えるため、可読性の高いコードを書けるようになります。

ただしあまりに複雑な内包表記を使うと、かえって可読性が低下する場合もあるので、適切な範囲で活用することが重要です。

Q
サイト改善アンケート|ご意見をお聞かせください(1分で終わります)

本サイトでは、みなさまの学習をよりサポートできるサービスを目指しております。
そのため、みなさまの「プログラミングを学習する理由」などをアンケート形式でお伺いしています。

1分だけ、ご協力いただけますと幸いです。

【Python】サイト改善アンケート
1.このサイトをどのように活用していますか?また、今後どのように活用したいですか?
5.気になっているサービス・商品があれば教えてください。
(複数選択可)
※ 特定の記事に関する内容の場合は、記事番号(Python Lesson〇-〇)をご記入願います。

練習問題:リストの内包表記を使ってみよう

この記事で学習した「リストの内包表記」を復習する練習問題に挑戦しましょう。

【Python】勉強猫がノートパソコンに向かい、練習問題に挑戦する様子。記事内の休憩用イラスト

問題|奇数を2倍にするリスト操作プログラムを作成しよう

1から10までの自然数を含むリストを作成し、その中から奇数だけを取り出して、さらにそれぞれを2倍にするプログラムを作成しましょう。

内包表記を使用しない方法と内包表記を使用した方法の2つの方法で実装してください。

以下の要件に従ってコードを完成させてください。

  • numbersというリストに1から10までの自然数を格納すること。
  • 内包表記を使わずに、numbersから奇数を取り出して2倍にしたリストを作成すること。
  • 内包表記を使って、numbersから奇数を取り出して2倍にしたリストを作成すること。
  • 作成した3つのリストを全て出力すること。

ただし、以下のような実行結果となるコードを書くこと。

元のリスト: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
内包表記を使わずに2倍にしたリスト: [2, 6, 10, 14, 18]
内包表記を使って2倍にしたリスト: [2, 6, 10, 14, 18]

ヒント|難しいと感じる人だけ見よう

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:元のリストを用意し、奇数だけを2倍して新しいリストに集める処理
 ・奇数判定は「2で割った余り」で判断する
 ・条件に合うときだけ結果用リストの末尾に追加する(append を使う)
 ・繰り返しは for 文、条件分岐は if 文で書く
 ・元のリスト名は numbers、結果のリスト名は doubled_numbers1 を使う

2:内包表記で同じ処理を一行化し、元・従来版・内包版の結果をまとめて表示する処理
 ・内包表記は「変換 → for → if」の順で並べる。
 ・奇数の判定は「2で割った余りが0でない」ことを条件にする。
 ・変数名は numbersdoubled_numbers1doubled_numbers2 をそのまま使う。
 ・出力は3行、ラベル文言は実行結果例と同じにする。

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# 1から10までの数をリストに格納します
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 内包表記を使わない書き方
doubled_numbers1 = []
for number in numbers:
    if number % 2 != 0:
        doubled_numbers1.'''(穴埋め)'''(number * 2)

# 内包表記を使う書き方
doubled_numbers2 = [number * 2 '''(穴埋め)''' number in numbers '''(穴埋め)''' number % 2 != 0]

# 結果を表示します
print(f"元のリスト: {numbers}")
print(f"内包表記を使わずに2倍にしたリスト: {doubled_numbers1}")
print(f"内包表記を使って2倍にしたリスト: {doubled_numbers2}")

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例|奇数だけ2倍にするプログラム

例えば以下のようなプログラムが考えられます。

Q
正解コード
# 1から10までの数をリストに格納します
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 内包表記を使わない書き方
doubled_numbers1 = []
for number in numbers:
    if number % 2 != 0:
        doubled_numbers1.append(number * 2)

# 内包表記を使う書き方
doubled_numbers2 = [number * 2 for number in numbers if number % 2 != 0]

# 結果を表示します
print(f"元のリスト: {numbers}")
print(f"内包表記を使わずに2倍にしたリスト: {doubled_numbers1}")
print(f"内包表記を使って2倍にしたリスト: {doubled_numbers2}")

解答例の解説|奇数だけ2倍にするプログラムの考え方

解答例の詳細解説は以下の通りです。

Q
詳細解説

元のリストを用意し、奇数だけを2倍して新しいリストに集める処理

# 1から10までの数をリストに格納します
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 内包表記を使わない書き方
doubled_numbers1 = []
for number in numbers:
    if number % 2 != 0:
        doubled_numbers1.append(number * 2)

はじめに、1から10までの数を並べた入れ物を準備します。
つぎに、結果を入れるための空の入れ物を用意します。
あとは元の入れ物から先頭から順に数を取り出し、奇数かどうかを確かめ、該当するものだけを2倍して結果の入れ物に追加していきます。
最後には、奇数だけが2倍された値だけが並ぶ新しい入れ物が完成します。
元の入れ物はそのまま残るため、元データと結果を別々に扱えます。

内包表記で同じ処理を一行化し、結果を表示する処理

# 内包表記を使う書き方
doubled_numbers2 = [number * 2 for number in numbers if number % 2 != 0]

# 結果を表示します
print(f"元のリスト: {numbers}")
print(f"内包表記を使わずに2倍にしたリスト: {doubled_numbers1}")
print(f"内包表記を使って2倍にしたリスト: {doubled_numbers2}")

さきほどの処理(奇数だけ取り出して2倍)を、一行で新しい並びを作れる書き方に置き換えます。
並びから順に値を取り出し、条件に合うものだけを選び、その場で2倍して新しい並びに入れていきます。
仕上げに、元の並び・従来の書き方の結果・一行の書き方の結果を、見やすいラベル付きで順番に表示します。
これで、同じ処理でも書き方を変えるとコード量や読みやすさがどう変わるかを比べられます。

もっと分かりやすい学習サイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいPython学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

【Python学習記事のアイキャッチ画像】Lesson4-6 リストのループ処理を理解しよう

Pythonの記事一覧

Python学習カテゴリの親ページ用アイキャッチ画像(テキスト&問題集)、記事一覧へのリンク案内

次のページ>>

【Python学習記事のアイキャッチ画像】Lesson4-8 データ構造の違いを理解しよう

リストの内包表記の疑問解消|FAQと用語のまとめ

初心者がつまずきやすいポイントをFAQとしてまとめ、またよく使う専門用語をわかりやすく整理しました。

理解を深めたいときや、ふと疑問に感じたときに役立ててください。

FAQ|リストの内包表記に関するよくある質問

Q
Q1. リスト内包表記は全てのfor文に置き換え可能ですか?

条件がシンプルな繰り返し処理には適していますが、複雑なネストや副作用のある処理には向きません。可読性も考慮しましょう。

Q
Q2. 条件付きの内包表記はどう書くのですか?

[x for x in list if 条件] のように記述します。条件を満たす要素だけを抽出した新しいリストを作成できます。

Q
Q3. ネストされたリスト内包表記は使うべきですか?

理解しづらくなる場合があるため注意が必要です。処理が複雑になる場合は通常のfor文の使用を検討しましょう。

Python用語集|リストの内包表記に関する用語一覧

今回の記事で出てきた用語・関数などを一覧で紹介します。

このサイトに出てくる 全てのPython用語をまとめた用語集 も活用してください。

Python用語定義・使い方の概要解説記事へのリンク
リスト複数のデータを順番に保持できるデータ構造。要素の追加や削除が容易で多用途に使われるLesson4-1
append() メソッドリストの末尾に新しい要素を追加するためのメソッド。リスト自体が変更される(破壊的)操作Lesson4-1
内包表記簡潔な構文でリストを生成する記法。[式 for 変数 in イテラブル] の形式で記述される本記事
記事URLをコピーしました