はじめに
この実験(Lab)では、Python のコンプリヘンション(Comprehensions)について学びます。これは、他のイテラブル(iterable)からリスト、セット、辞書などのデータ構造を非常に簡潔な構文で作成できる特殊な構文です。コンプリヘンションは、1 つまたは 2 つのネストされた for ループを扱う際に非常に役立ち、コードの可読性を高め、多くの場合効率も向上させます。
最も一般的なタイプであるリストコンプリヘンションから始め、従来の for ループと比較します。次に、条件付きロジックを追加して要素をフィルタリングしたり変換したりする方法を学びます。最後に、セットや辞書を作成する際に、同じ原則がどのように適用されるかを確認します。
リストコンプリヘンション
このステップでは、他のイテラブル (iterable) からリストを簡潔に作成するためのリスト内包表記の基本的な構文を学習します。従来の for ループのアプローチと、よりエレガントなリスト内包表記の構文を比較します。
注記: WebIDE (VS Code のようなもの) の使用に慣れていない場合は、まずこちらの実験 (lab)で学習してください。
まず、標準の for ループを使用して既存のリストから新しいリストを作成する方法を見てみましょう。
左側のファイルエクスプローラーから main.py ファイルを開きます。以下のコードをファイルにコピー&ペーストしてください。
## 従来のアプローチ:for ループを使用してリストを作成
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = []
for n in names:
new_list.append(n)
print(new_list)
コードを実行するには、ターミナルパネルの + アイコンをクリックし、「New Terminal」を選択してターミナルを開きます。次に、以下のコマンドを実行します。
python3 main.py
以下の出力が表示されます。
['Charles', 'Susan', 'Patrick', 'George']
次に、リスト内包表記を使用して同じ結果を達成してみましょう。基本的な構文は [expression for item in iterable] です。
main.py の内容を以下のコードに置き換えてください。
## リスト内包表記:新しいリストを作成するための簡潔な方法
## 構文:[expression for item in iterable]
names = ['Charles', 'Susan', 'Patrick', 'George']
new_list = [n for n in names] ## すべての名前でリストを作成
print(new_list)
スクリプトを再度実行します。
python3 main.py
出力は同一ですが、コードははるかに短く、より記述的になっています。
['Charles', 'Susan', 'Patrick', 'George']
リスト内包表記はネストされたループも処理できます。例えば、2 つの範囲からタプルのリストを作成するには、次のように行えます。
main.py ファイルをこのコードで更新して実行してください。
## ネストされたリスト内包表記:2 つの範囲からタプルを作成
## ネストされた for ループと同等
n = [(a, b) for a in range(1, 3) for b in range(1, 3)]
print(n)
スクリプトを実行します。
python3 main.py
出力は、考えられるすべてのタプルの組み合わせのリストになります。
[(1, 1), (1, 2), (2, 1), (2, 2)]
条件分岐の追加
このステップでは、リストコンプリヘンションに条件付きロジックを組み込む方法を探ります。if ステートメントを使用した要素のフィルタリング方法と、if-else 構造を使用した各要素への条件付き式の適用方法を学びます。
例えば、「C」で始まる名前のみを含む新しいリストを作成したいとします。従来の for ループでは、ループ内に if ステートメントを追加します。
main.py を次のコードに更新してください。
## 従来の方式:if 条件でフィルタリング
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = []
for n in names:
if n.startswith('C'): ## 'C'で始まる名前をフィルタリング
new_list.append(n)
print(new_list)
スクリプトを実行して結果を確認します。
python3 main.py
出力:
['Charles', 'Carol']
これをリストコンプリヘンションで行うには、if ステートメントを末尾に追加します。構文は [expression for item in iterable if condition] です。
main.py でこれを試してみてください。
## 条件付きリストコンプリヘンション:要素をフィルタリング
## 構文:[expression for item in iterable if condition]
names = ['Charles', 'Susan', 'Patrick', 'George', 'Carol']
new_list = [n for n in names if n.startswith('C')]
print(new_list)
実行すると、同じフィルタリングされたリストが得られます。
python3 main.py
出力:
['Charles', 'Carol']
if-else ステートメントを使用して、すべての要素に対して条件付きのアクションを実行することもできます。この場合、if-else 式は for ループの前に配置されます。構文は [expression_if_true if condition else expression_if_false for item in iterable] です。
偶数を 2 倍にし、奇数はそのまま保持する新しいリストを作成してみましょう。main.py を次のコードに更新して実行してください。
## if-else を使用したリストコンプリヘンション:条件付き式
## 構文:[expression_if_true if condition else expression_if_false for item in iterable]
nums = [1, 2, 3, 4, 5, 6]
new_list = [num*2 if num % 2 == 0 else num for num in nums] ## 偶数を 2 倍にする
print(new_list)
スクリプトを実行します。
python3 main.py
出力は、偶数のみが 2 倍になっていることを示しています。
[1, 4, 3, 8, 5, 12]
セットコンプリヘンション
このステップでは、コンプリヘンション構文をセットの作成に適用する方法を理解します。リストコンプリヘンションの基本は、セットや辞書にも適用できます。
セットコンプリヘンションはリストコンプリヘンションと非常によく似ています。主な違いは、角括弧 [] の代わりに波括弧 {} を使用し、重複のない要素の順序付けられていないコレクションであるセットを生成することです。
構文は {expression for item in iterable} です。
別のセットから新しいセットを作成し、そのすべての文字列要素を大文字に変換してみましょう。main.py ファイルを次のコードに更新してください。
## セットコンプリヘンション:コンプリヘンション構文を使用してセットを作成
## 構文:{expression for item in iterable}
b = {"abc", "def"}
upper_set = {s.upper() for s in b} ## すべての文字列を大文字に変換
print(upper_set)
次に、スクリプトを実行します。
python3 main.py
出力は、大文字の文字列を含む新しいセットになります。セットは順序付けられていないため、出力における要素の順序は異なる場合があることに注意してください。
{'DEF', 'ABC'}
元のイテラブルに重複するアイテムがあった場合、セットは自動的に重複を破棄するため、結果のセットには一意の要素のみが含まれます。
辞書コンプリヘンション
このステップでは、辞書コンプリヘンションを使用して辞書を構築する方法を学びます。セットコンプリヘンションと同様に波括弧 {} を使用しますが、コロンで区切られたキーと値のペアが必要です。
構文は {key_expression: value_expression for item in iterable} です。
一般的な使用例は、既存の辞書のキーと値を変換または入れ替えることによって新しい辞書を作成することです。辞書のキーと値を入れ替えてみましょう。
main.py ファイルを次のコードに更新してください。
## 辞書コンプリヘンション:キーと値を入れ替える
## 構文:{key_expression: value_expression for item in iterable}
c = {'name': 'Pooka', 'age': 5}
swapped_dict = {v: k for k, v in c.items()} ## キーと値のペアを反転
print(swapped_dict)
スクリプトを実行します。
python3 main.py
出力は、元の値がキーになり、元のキーが値になった新しい辞書になります。
{'Pooka': 'name', 5: 'age'}
コンプリヘンションを使用して、辞書から他のデータ型を作成することもできます。例えば、リストコンプリヘンションを使用して、辞書アイテムから整形された文字列のリストを生成する方法を以下に示します。
main.py のコードをこの例に置き換えて実行してください。
## 辞書からのリストコンプリヘンション:整形された文字列を作成
c = {'name': 'Pooka', 'age': 5}
formatted_list = ["{}:{}".format(k.upper(), v) for k, v in c.items()] ## "KEY:value" 形式に整形
print(formatted_list)
スクリプトを実行します。
python3 main.py
これにより、辞書ではなく文字列のリストが生成されます。
['NAME:Pooka', 'AGE:5']
これは、コンプリヘンションを使用してさまざまなデータ構造を処理および変換する柔軟性を示しています。このステップの最後の課題として、main.py に辞書を入れ替えるコードが含まれていることを確認してください。
まとめ
この実験(Lab)では、Python の強力なコンプリヘンション構文を使用して、リスト、セット、辞書を簡潔かつ読みやすい方法で作成する方法を学びました。
まずリストコンプリヘンションから始め、従来の for ループよりもエレガントな代替手段となることを確認しました。次に、末尾の if を使用してフィルタリングし、if-else 式を使用して要素を変換することで、条件付きロジックを追加する方法を学びました。最後に、これらの同じ原則がセットコンプリヘンションと辞書コンプリヘンションにも適用され、波括弧 {} を使用して一意のアイテムのセットやキーと値のペアの辞書を構築する方法を見ました。
コンプリヘンションは、イディオマティック(慣用的)な Python コードの基本的な部分です。これらを習得することで、コードはより効率的でエレガントになります。継続的に練習し、Python プログラミングツールキットの自然な一部にしてください。



