この記事を書いたきっかけ
Pythonでプログラミングの練習をしています。一般的なリストや辞書を書くことには慣れてきましたが、内包表記にはなかなか慣れません。内包表記を使ってリストや辞書をうまく書くには、その構造をよく理解して何度も練習する必要があります。
そこで、内包表記の書き方を簡単にまとめたいと思い、記事にしました。
オススメの記事
内包表記とは
内包表記とは、Pythonにおいてイテラブル(例えばリスト、辞書、集合など)から新しいイテラブルを簡潔に生成するための構文です。読みやすいコードを簡単に書くことができます。
1. リスト内包表記
リストから新しいリストを作成する際に使います。条件を加えてフィルタリングや要素の変換ができます。
コード例
# 0から9までの数値の二乗をリストにする
squares = [x**2 for x in range(10)]
print(squares) # 出力: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
条件付きの例
# 0から9までの偶数の二乗をリストにする
even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(even_squares) # 出力: [0, 4, 16, 36, 64]
2. 辞書内包表記
辞書やリスト、タプルなどから新しい辞書を作成する際に使います。
コード例
# 0から9までの数値とその二乗のペアを持つ辞書を作成
square_dict = {x: x**2 for x in range(10)}
print(square_dict) # 出力: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
条件付きの例
# 0から9までの偶数とその二乗のペアを持つ辞書を作成
even_square_dict = {x: x**2 for x in range(10) if x % 2 == 0}
print(even_square_dict) # 出力: {0: 0, 2: 4, 4: 16, 6: 36, 8: 64}
3. 集合内包表記
イテラブルから新しい集合を作成する際に使います。重複を自動的に排除します。
コード例
# 文字列内の文字を大文字に変換し、重複を排除して集合にする
unique_chars = {char.upper() for char in "hello world"}
print(unique_chars) # 出力: {'L', 'O', 'E', 'R', 'H', 'W', 'D'}
条件付きの例
# 文字列内の母音を大文字に変換し、重複を排除して集合にする
vowels = {char.upper() for char in "hello world" if char in 'aeiou'}
print(vowels) # 出力: {'O', 'E'}
ネストした内包表記
1. ネストしたリスト内包表記
2次元リストのような複雑なデータ構造を平坦化する場合や、ネストしたループで新しいリストを作成する場合に使用します。
コード例
# 2次元リストを1次元リストに平坦化する
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]
条件付きの例
# 2次元リストから偶数だけを取り出して1次元リストに平坦化する
even_flattened = [num for row in matrix for num in row if num % 2 == 0]
print(even_flattened) # 出力: [2, 4, 6, 8]
2. ネストした辞書内包表記
辞書のキーと値を複雑な変換を行いたい場合や、ネストしたループを使用して新しい辞書を作成する場合に使用します。
コード例
# ネストした辞書を作成
nested_dict = {(i, j): i * j for i in range(3) for j in range(3)}
print(nested_dict) # 出力: {(0, 0): 0, (0, 1): 0, (0, 2): 0, (1, 0): 0, (1, 1): 1, (1, 2): 2, (2, 0): 0, (2, 1): 2, (2, 2): 4}
条件付きの例
# 条件を満たすペアのみを含むネストした辞書を作成
filtered_nested_dict = {(i, j): i * j for i in range(3) for j in range(3) if i != j}
print(filtered_nested_dict) # 出力: {(0, 1): 0, (0, 2): 0, (1, 0): 0, (1, 2): 2, (2, 0): 0, (2, 1): 2}
3. ネストした集合内包表記
ネストしたループで新しい集合を作成する場合に使用します。
コード例
# 2次元リストの全要素を集合に変換
matrix = [[1, 2, 2], [3, 4, 4], [5, 5, 6]]
unique_nums = {num for row in matrix for num in row}
print(unique_nums) # 出力: {1, 2, 3, 4, 5, 6}
条件付きの例
# 2次元リストから偶数のみを取り出して集合に変換
even_unique_nums = {num for row in matrix for num in row if num % 2 == 0}
print(even_unique_nums) # 出力: {2, 4, 6}
まとめ
この記事は内包表記をうまく書けるようにするために書きました。ただ、何度も練習しないと内包表記を書けるようになりません。
内包表記を練習してみて、よくわからなくなったら、この記事やリンクのオススメの記事を見直したいと思います。