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

記事内に商品プロモーションを含む場合があります

この記事で学べる知識:リストの内包表記

この記事の練習問題で使用する知識:
レッスン1~3の知識リストの定義と要素追加リストの要素削除リストの情報出力リストの集計・並べ替えリストのスライスリストのループ処理リストの内包表記タプルの定義と基本操作タプルのアンパックとネスト辞書の定義と基本操作辞書のループ処理辞書の内包表記集合の定義と基本操作

<<前の問題 問題集Top 次の問題>>

Pythonの「リストの内包表記」とは

この章ではPythonにおける「リストの内包表記」の意味や使い方を学習します。必要ない方はここをクリックして練習問題へ飛びましょう。




Pythonではリストの操作が非常に効率的に行える「リストの内包表記」という機能があります。

内包表記を使うことで、従来のforループによるリスト作成を1行で簡潔に書くことができ、コードの可読性が向上します。

リストの内包表記は、リスト内の要素に対する操作や条件を効率的に処理するための強力なツールです。

リストの内包表記とは?

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

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

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

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

numbers = [1, 2, 3, 4, 5]
squared_numbers = []
for number in numbers:
    squared_numbers.append(number ** 2)
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倍にして新しいリストを作成するものです。上の事例でも紹介した、最も基本的な内包表記の使い方でしょう。

numbers = [1, 2, 3, 4, 5]
doubled_numbers = [number * 2 for number in numbers]
print(doubled_numbers)

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

[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に追加しています。

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

リストの内包表記の応用

リストの内包表記は、複数のforループをネストした処理や、さらに条件を追加した処理にも応用できます。

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

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

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for row in matrix for num in row]
print(flattened)

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

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

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

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

まとめ

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

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

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

練習問題4-7:奇数を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からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

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

正解のコードは上から順に以下のような構成となっています。
(※下記の□はコード内のインデントを表しています)

1:numbersというリストに1から10までの自然数を格納する
2:変数doubled_numbers1を空のリストとして定義する
3:for文でnumbersの各要素を順に取り出す
  □ if文で奇数かどうかを判定する
  □ 真の場合、2倍した値をdoubled_numbers1に追加する
4:内包表記を使用して、奇数を2倍にした結果をリストdoubled_numbers2に格納する
5:f文字列を使って、元のリストnumbersを表示する
6:f文字列を使って、内包表記を使わないで作成したリストdoubled_numbers1を表示する
7:f文字列を使って、内包表記を使って作成したリストdoubled_numbers2を表示する

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

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

# 1から10までの数をリストに格納します

"""【穴埋め問題1】
ここにnumbersというリストを作成し、1から10までの数を格納するコードを書いてください。
"""

# 内包表記を使わない書き方
doubled_numbers1 = []

"""【穴埋め問題2】
ここにfor文を使って、numbersリストから奇数を取り出して2倍にする処理を記述してください。
"""

# 内包表記を使う書き方

"""【穴埋め問題3】
ここにリスト内包表記を使って、奇数を2倍にするリストを作成するコードを書いてください。
"""

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

 

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



解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

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

# リストの内包表記を学習するためのプログラム

# 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}")

正解コードの解説

このコードではPythonで「リストの内包表記」を使って奇数を2倍にする方法を学びます。

リストの内包表記は簡潔で効率的にリストを生成するためのPythonの特徴的な文法です。

このコードをブロックごとに分解し、それぞれの動作を詳しく説明します。

リストの定義

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

ここではnumbersというリストに1から10までの数値を格納しています。

このリストを使用して、後で奇数を2倍にする処理を行います。

内包表記を使わない方法で奇数を2倍にする

doubled_numbers1 = []
for number in numbers:
    if number % 2 != 0:
        doubled_numbers1.append(number * 2)

この部分ではリスト内包表記を使わずに、forループとif文を使って奇数を2倍にしています。

まずnumbersリストの中を1つずつ取り出し、その数が奇数 (number % 2 != 0) かどうかを判定します。

奇数であればその数を2倍して、doubled_numbers1という新しいリストに追加しています。

リストの内包表記を使った方法

doubled_numbers2 = [number * 2 for number in numbers if number % 2 != 0]

ここがこのコードの最も重要な部分です。

リストの内包表記を使って上記のforループとif文を一行で表現しています。

  • for number in numbersでリストnumbersから一つずつ値を取り出します。
  • if number % 2 != 0で奇数かどうかを判定します。
  • 奇数の場合、number * 2でその数を2倍にし、結果を新しいリストdoubled_numbers2に格納します。

リストの内包表記を使うことで、コードを短く書けるだけでなく読みやすさも向上します。

結果の表示

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

最後に、元のリストとそれぞれの方法で作成したリストを表示します。

これにより、リストの内包表記を使うことで従来のforループを使った方法と同じ結果が得られることが確認できます。

まとめ

このコードではリストの内包表記を学ぶことができました。

リスト内包表記を使うことでリスト操作を短く効率的に書けるようになります。

Pythonでリスト操作を行う際は、リストの内包表記を積極的に活用しましょう。

<<前の問題 問題集Top 次の問題>>

この記事への質問・コメント

この記事を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Python記事トップへ戻る
    トップページへ戻る