問題編:Pythonのfor文を使った練習問題

引き続き、Pythonのfor文を使った練習問題6〜10問です。基本的な処理を通して更に理解を深めましょう。
問題6: 特定の条件でセットを操作する
以下にセットが与えられています。このセットから、次の条件を満たす要素のみを抽出し、新しいセットを作成してください:
要素が10以上かつ60以下の場合
numbers = {5, 12, 17, 24, 36, 45, 58, 63, 72}回答:
numbers = {5, 12, 17, 24, 36, 45, 58, 63, 72}
range_number = {number for number in numbers if 10 <= number <= 60} # 条件を満たす要素を抽出
print(range_number)実行結果:
{12, 17, 24, 36, 45, 58}解説:
- 集合内包表記:
集合内包表記を活用することで、指定された条件を満たす要素を直接抽出し、コードを簡潔に記述できます。 - 条件判定:
10 <= number <= 60では、範囲内に属するかどうかを判定しています。この条件を満たす値のみが新しいセットに抽出されます。
注意点(私が間違えた箇所):
- セットの初期化:
セットを初期化する際にはset()を使いますが、誤って[]のようにリストとして初期化してしまうとエラーが発生することがあります。 - セットへの要素追加:
セットの追加には.add()を使います。ただし、リストの操作方法.append()とは異なることに注意してください。
問題7: セットとリストの重複要素の抽出
以下のセットとリストから、共通している要素のみを抽出して新しいセットを作成してください。
set_values = {3, 8, 15, 23, 42, 58, 60}
list_values = [5, 8, 15, 24, 42, 60, 72]回答:
set_values = {3, 8, 15, 23, 42, 58, 60}
list_values = [5, 8, 15, 24, 42, 60, 72]
intersectionを使って重複部分を抽出
common_values = set_values.intersection(list_values)
print(common_values)実行結果:
{8, 15, 42, 60}解説:
- intersectionメソッド:
intersection()は、セット同士またはセットとリストの共通要素を簡単に抽出するために使用されます。 - 効率性:
ループを使用した方法よりも速く、コードがシンプルになります。
注意点(私が間違えたコード):
range_number = set()
for set_value in set_values:
for list_value in list_values:
if set_value == list_value:
range_number.add(set_value)
print(range_number)- この方法では入れ子構造(ネスト)によるループ処理で、セットとリストのすべての要素の組み合わせをチェックしています。
- シンプルにするために
intersection()を使用することで、条件付きループを省略できます。
問題8: リストからセットへの変換とフィルタリング
以下のリストについて、次の処理を実現してください:
- 重複のない値だけをセットに変換してください。
- セットの中から偶数を取り除き、最終的なセットを出力してください。
list_values = [12, 15, 18, 20, 22, 15, 25, 30, 18, 30, 12, 35]回答:
list_values = [12, 15, 18, 20, 22, 15, 25, 30, 18, 30, 12, 35]
set_values = set(list_values)
odd_number = {number for number in set_values if number % 2 != 0} # 条件に合う奇数を直接生成
print(odd_number)実行結果:
{25, 35, 15}解説:
- セットへの変換:
リストをset()を使ってセットに変換すると、自動的に重複が取り除かれます。 - 集合内包表記の活用:
集合内包表記{number for number in set_values if number % 2 != 0}を使うことで偶数ではない値(奇数)のみを新しいセットに生成できます。これによりコードを簡潔に記載することができます。
注意点(私が作ったコード):
list_values = [12, 15, 18, 20, 22, 15, 25, 30, 18, 30, 12, 35]
set_values = set(list_values)
odd_number = set() # 空のセットを初期化
for number in set_values:
if number % 2 != 0:
odd_number.add(number) # 奇数のみ追加
print(odd_number)- 空のセットの初期化:
セットを初期化する場合はset()を使います。例えば、= 0などのように記載するとエラーが発生します。間違いを防ぐためにset()を使うことに注意してください。 - 明示的なループを使った方法では1行ずつ処理を記述しており、コードは具体的でわかりやすいです。ただし、集合内包表記を利用することで、コードをさらに簡潔にすることも可能です。
問題9: リストの値を操作して再構築する
以下のリストが与えられています。このリストに対して以下の操作を行ってください:
- リストの中に存在するすべての値を2倍にしてください。
- 2倍にした結果、10より大きい値だけを抽出し、新しいリストを作成してください。
values = [2, 4, 5, 8, 10]回答:
values = [2, 4, 5, 8, 10]
new_values = [value * 2 for value in values if value * 2 > 10]
print(new_values)実行結果:
[16, 20]解説:
- 元のリストと初期化:
valuesというリストに、処理対象となる元の値が格納されています。 - リスト内包表記の活用:
リスト内包表記を使用して、値を2倍にした結果が10より大きい要素を抽出しています。 - 条件の意味:
value * 2 > 10によって、2倍にした結果が10より大きい値を新しいリストに追加しています。
注意点:
- 明示的なループを使った方法との違い:
リスト内包表記は簡潔で可読性が高いですが、コードの流れを見たい場合やより具体的に記述したい場合は、明示的なループを使うことも有効です。 - 内包表記の学習:
内包表記を覚えることで、より短く効率的なPythonコードを書くことができます。他のデータ構造(セットや辞書)にも応用できます。
参考コード:
# 明示的なループによる方法
values = [2, 4, 5, 8, 10]
new_values = []
for value in values:
value *= 2
if value > 10:
new_values.append(value)
print(new_values)明示的なループの方法およびリスト内包表記の方法を比較することで、リスト操作の柔軟性を学ぶことができます。
問題10: 辞書内の値を条件に応じて変更する
次の辞書が与えられています。この辞書を操作して以下を実現してください:
- 条件に応じた値の変更:
- 辞書内の各値が20より小さい場合、その値を2倍にしてください。
- 新しいキーと値の追加:
- 辞書に、キー
"total"を追加し、値の合計をそのキーに関連付けてください。
- 辞書に、キー
data = {"a": 10, "b": 15, "c": 25}回答
data = {"a": 10, "b": 15, "c": 25}
data["total"] = 0
for key in data:
if key != "total":
if data[key] < 20:
data[key] *= 2
data["total"] += data[key]
print(data)実行結果
{"a": 20, "b": 30, "c": 25, "total": 75}解説
-
data[key] *= 2
辞書の値の更新は、キーを使って値をアクセスし、更新する必要があります。 -
totalのキーを除外
for key in data:のループで、key != "total"と条件を付けて処理を行うことで、既に存在している"total"キーを含めずに操作します。 -
合計を計算しながら更新
値を変更した後ですぐに合計に加えることで、最終的なtotalの値が正しく計算されます。
ちなみに私の回答は
data = {"a": 10, "b": 15, "c": 25}
data["total"] = 0
for value in data.values():
if value < 20:
value *= 2
data["total"] += value
print(data)いろいろと混乱しています。
辞書型について理解が必要です。次回は「辞書型」について学習をしていきましょう。


コメント