やりたいこと
- 内包表記について、以下のことを調べる。
- どんな書き方をするか
- どんな種類があるか
- 応用例
そもそも「内包表記」(comprehensions)とは
-
公式ドキュメントより
ループ処理とフィルター処理の組み合わせを用いた計算結果
内包表記の書き方
色々ありますが、どれも基本的には
hoge = [変数を使った式 for 変数 in イテラブルオブジェクト]
という文法になります。(↑はリスト内包表記の例なので、囲む記号に[]
を使用)
内包表記の種類
種別 | 囲む記号 | 例 | ←で作られたもの |
---|---|---|---|
リスト内包表記 | [] | [x for x in range(3)] | [0, 1, 2] |
集合内包表記 | {} | {x*2 for x in range(3)} | {0, 2, 4} |
辞書内包表記 | {} | {x: x**2 for x in range(3,6)} | {3: 9, 4: 16, 5: 25} |
ジェネレータ式 | () | (x for x in range(3)) | generator object |
リスト内包表記
内包表記を使わない場合
sample_list = []
for x in range(3):
sample_list.append(x) # [0, 1, 2]
内包表記を使った場合
sample_list = [x for x in range(3)] # [0, 1, 2]
集合内包表記
内包表記を使わない場合
sample_set = set()
for x in range(3):
sample_set.add(x) # {0, 1, 2}
内包表記を使った場合
sample_set = {x for x in range(3)} # {0, 1, 2}
辞書内包表記
内包表記を使わない場合
exponentiation_dict = {}
for k in range(5):
exponentiation_dict['2の{}乗'.format(k)] = 2 ** k
# {'2の0乗': 1, '2の1乗': 2, '2の2乗': 4, '2の3乗': 8, '2の4乗': 16}
内包表記を使った場合
exponentiation_dict = {"2の{}乗".format(i): 2 ** i for i in range(5)}
# {'2の0乗': 1, '2の1乗': 2, '2の2乗': 4, '2の3乗': 8, '2の4乗': 16}
ジェネレータ式
内包表記を使わない場合(ジェネレータ関数定義)
def sample_generator_before():
for x in range(3):
yield x
g = sample_generator_before()
print(g.__next__()) # 0
print(g.__next__()) # 1
print(g.__next__()) # 2
print(g.__next__()) # StopIteration
内包表記を使った場合
g = (x for x in range(3))
print(g.__next__()) # 0
print(g.__next__()) # 1
print(g.__next__()) # 2
print(g.__next__()) # StopIteration
応用
ifを使う
リスト内包表記を使わない場合
sample_even_list = []
for x in range(10):
if x % 2 == 0:
sample_even_list.append(x)
リスト内包表記を使った場合
sample_even_list = [x for x in range(10) if x % 2 == 0] # [0, 2, 4, 6, 8]
複数のリストから辞書を作る
リスト内包表記を使わない場合
name_list = ['Tom', 'Mike', 'Emma']
age_list = [5, 7, 3]
sample_dict = {}
for name, age in zip(name_list, age_list):
sample_dict[name] = age
# {'Tom': 5, 'Mike': 7, 'Emma': 3}
リスト内包表記を使った場合
name_list = ['Tom', 'Mike', 'Emma']
age_list = [5, 7, 3]
sample_dict = {name: age for name, age in zip(name_list, age_list)}
# {'Tom': 5, 'Mike': 7, 'Emma': 3}