LoginSignup
2
1

More than 1 year has passed since last update.

内包表記に入門する【Python】

Last updated at Posted at 2022-05-16

やりたいこと

  • 内包表記について、以下のことを調べる。
    • どんな書き方をするか
    • どんな種類があるか
    • 応用例

そもそも「内包表記」(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}

参考URL

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1