内包表記のパターン
Pythonでは、リストや辞書などを作成する場合、for などで作成しても良いのですが、内包表記を使う事で可読性の高いコーディングができます。
また、処理も高速になるので内包表記を使いこなすメリットは大きいです。
例えばリストを for 文で作成した場合、以下のように実装するケースがあると思います。
リスト内包表記
l1 = [] for i in range(1,11): l1.append(i) print(l1) # 出力内容 # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
これを内包表記を使って書くと以下のようになります。
l2 = [i for i in range(1, 11)] print(l2) #出力内容 #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
出る結果は同じですが、3行必要なコードが1行で済みます。
また、for の前に演算子を使って出力する事もできます。
以下の例では i の 2乗をリストに格納しています。
l3 = [i ** 2 for i in range(1, 11)] print(l3) # 出力結果 # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
次は集合内包表記です。リストの [] の部分が {} になります。
集合内包表記
s1 = {i for i in range(1, 11)} print(s1) # 出力結果 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
上記では、たまたま順番が昇順にならんでいますが、リストと違い必ずしも range関数の順番通りになるわけではありません。
また、集合の性質から重複はありません。
l = [1, 1, 1, 1, 1, 1] s2 = {i for i in l} print(s2) # 出力結果 {1}
リストと同じく for の前に演算子を入れる事もできます。
s3 = {i ** 2 for i in range(1, 11)} print(s3) # 出力結果 {64, 1, 4, 36, 100, 9, 16, 49, 81, 25}
辞書内包表記
辞書もリスト、集合と考え方は全く同じなのですが key と value があるので私は、ちょっと理解しにくかった部分です。
d = {i: i ** 2 for i in range(1, 11)} print(d) # 出力結果 {1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81, 10: 100}
key の部分に range関数で1 ~ 10 までの値を i に代入していきます。
value の部分には i を 2乗した値が代入されて辞書が完成しています。
条件付き内包表記1
内包表記でリストを作成する時に、条件を付け加える事ができます。
l = [i for i in range(1, 11) if i % 2 == 0] print(l) # 出力内容 [2, 4, 6, 8, 10]
range関数で1 ~ 10 までの値を i に代入します。
その後に条件式が記述されており、if を使って偶数である場合にのみ i に値を代入しています。
条件付き内包表記2
条件付き内包表記の if と else を組み合わせた「条件付き内包表記1」の応用版です。
d = {i: "偶数" if i % 2 == 0 else "奇数" for i in range(1, 11)} print(d) # 出力結果 {1: '奇数', 2: '偶数', 3: '奇数', 4: '偶数', 5: '奇数', 6: '偶数', 7: '奇数', 8: '偶数', 9: '奇数', 10: '偶数'}
range関数で1 ~ 10 までの値を i に代入するのは「条件付き内包表記1」と一緒です。
今回変更しているのは、if と else が記述されている部分になります。
もし、偶数であるならば value に偶数を、奇数であるならば value に奇数を代入します。
条件分岐する事で内包表記の表現の幅が増やせました。