この記事で学べる知識:リストの内包表記
この記事の練習問題で使用する知識:
レッスン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: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を表示する
以下のコードをコピーし、コメントに従ってコードを完成させて下さい。
# 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を活用しています。
問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。