【Python】Python ~ リスト内包表記 ~

◾️はじめに

今更ながら、Pythonのリスト内包表記(List comprehensions)
について扱う。

目次

【1】リスト内包表記(List comprehensions)
 1)例
【2】リスト内包表記の種類
 1)配列(list)
 2)集合(set)
 3)辞書(dict)
【3】リスト内包表記の覚え方
 1)通常のforループから書き換える練習をする
 2)if文が入るパターンも段階的に慣れる
 3)日本語で構文を「翻訳」して考える
 4)「型」だと思って暗記する

【1】リスト内包表記(List comprehensions)

* 既存のリストから新しいリストを作るためのリスト作成方法
 => どう言ったものかは、具体的にみた方が早い

1)例

# ↓のような書き方を「リスト内包表記(List comprehensions)」という
list = [x**2 for x in range(10)]
print(list) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# ネストも可能
list2 = [(x, y) for x in range(2) for y in range(3)]
print(list2) # (0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2)]   

【2】リスト内包表記の種類

1)配列(list)

results = [x for x in iterable]

2)集合(set)

results = {x for x in iterable}

3)辞書(dict)

results = {k: v for k, v in iterable}

【3】リスト内包表記の覚え方

* 「覚え方のコツ」をChatGPTに聞いてみて、良かったものを一部抜粋

1)通常のforループから書き換える練習をする

* まずはforループで処理を書く → それを内包表記に変換する練習が効果的
=>「何を作るか(i * 2)」 + 「どこから取るか(for i in range(5))」
  という構造に注目!

例: 通常のforループ

result = []
for i in range(5):
    result.append(i * 2)

リスト内包表記

result = [i * 2 for i in range(5)]

2)if文が入るパターンも段階的に慣れる

* for の後に if をつけることで フィルタリングができる。

# 偶数だけ取りたい場合
result = [i for i in range(10) if i % 2 == 0]

3)日本語で構文を「翻訳」して考える

[i * i for i in range(5) if i % 2 == 0]

これを日本語で考えると

*「0から4までの数字のうち偶数だけを選んで、それらを2乗するリスト」
 =>  0から4までの数字(i in range(5))のうち
  偶数だけを選んで(if i % 2 == 0)、
  それらを2乗する(i * i)

4)「型」だと思って暗記する

* 次の「型」を覚えておくと便利

基本形

[式 for 変数 in イテラブル]

フィルタ付き

[式 for 変数 in イテラブル if 条件]

入れ子(ネスト)

[式 for 変数1 in イテラブル1 for 変数2 in イテラブル2]

関連記事

Python ~ 基本編 / リスト ~
https://dk521123.hatenablog.com/entry/2019/10/12/084943
Python ~ 基本編 / スライス操作 ~
https://dk521123.hatenablog.com/entry/2020/11/14/000000
Python ~ 基本編 / 文字列 ~
https://dk521123.hatenablog.com/entry/2019/10/12/075251
Python ~ 基本編 / 型指定・Typing ~
https://dk521123.hatenablog.com/entry/2021/12/23/231559
Python ~ 基本編 / ラムダ lambda ~
https://dk521123.hatenablog.com/entry/2019/09/23/000000
Python ~ 基本編 / リスト・あれこれ ~
https://dk521123.hatenablog.com/entry/2020/11/01/000000
Python に関する資格
https://dk521123.hatenablog.com/entry/2019/12/17/225829