【Python】MutableSequenceを継承してリスト風クラスを作成する
MAX
MAX999blog
for文を1行で書いたり(リスト内包表記)、if-else文を1行で書いたり(三項演算子)するのは非常に便利で良く使う表記。
更にリスト内包表記と三項演算子を合わせて使うことも非常に便利な表現だが、
if文とfor文、if-else文とfor文で語順が違ったりしてたまにド忘れしたりする。
そんな時のための備忘録。
for文の中の処理が1行で書ける時などに良く使う。
1nums = [1, 2, 3, 4, 5, 6]
2nums_mul_2 = [n*2 for n in nums]
3print(nums_mul_2)
4# [2, 4, 6, 8, 10, 12]
リスト以外にもタプルや辞書のキーと値など、for文で繰り返し処理が書けるものはこの書き方ができる。
1# タプルをリスト内包表記でループさせる
2tuple_a = ("a", "b", "c")
3list_d = [f"t_{a}" for a in tuple_a]
4print(list_d)
5# ['t_a', 't_b', 't_c']
6
7# 辞書の値をリスト内包表記でループさせる
8dict_a = {"a": 1, "b": 2, "c": 3}
9list_e = [v*2 for v in dict_a.values()]
10print(list_e)
11# [2, 4, 6]
12
13# 辞書のキーをリスト内包表記でループさせる
14dict_a = {"a": 1, "b": 2, "c": 3}
15list_f = [f"f_{k}" for k in dict_a.keys()]
16print(list_f)
17# ['f_a', 'f_b', 'f_c']
18
19# 辞書のキーと値をループさせる
20dict_a = {"a": 1, "b": 2, "c": 3}
21list_g = [f"{k}_{v}" for k, v in dict_a.items()]
22print(list_g)
23# ['a_1', 'b_2', 'c_3']
リスト内包表記と同様に辞書も辞書内包表記で作成することが可能。
1list_a = ["a", "b", "c"]
2list_b = ["A", "B", "C"]
3# 辞書を辞書内包表記で作成
4dict_b = {a: b for a, b in zip(list_a, list_b)}
5print(dict_b)
6# {'a': 'A', 'b': 'B', 'c': 'C'}
なおタプルは()で囲むことで作成可能だが、リスト内包表記のようなやり方でタプルを作成しようとしてもタプルは作成されずにジェネレーターが作成される。
1list_a = ["a", "b", "c"]
2gen_a = (f"g_{a}" for a in list_a)
3print(gen_a)
4# <generator object <genexpr> at 0x105a0cac0>
if-else文を1行で書きたい時に使う。
if-elifなども使えるが、可読性のためになるべくif-elseぐらいにした方がいいと思う。
1a = 2
2num_type = "odds" if a % 2 == 1 else "even"
3print(num_type)
4# even
5
6a = 3
7num_type = "odds" if a % 2 == 1 else "even"
8print(num_type)
9# odds
リスト内包表記にif文を入れる場合はif節が後ろの方に来る。
1nums = [1, 2, 3, 4, 5, 6]
2
3odds = [num for num in nums if num % 2 == 1]
4evens = [num for num in nums if num %2 == 0]
5print(odds)
6print(evens)
7# [1, 3, 5]
8# [2, 4, 6]
リスト内包表記にif-else文を入れる場合はif-else文を先に書く。
1nums = [1, 2, 3, 4, 5, 6]
2
3num_types = ["odd" if num %2 == 1 else "even" for num in nums]
4print(num_types)
5# ['odd', 'even', 'odd', 'even', 'odd', 'even']
処理速度的にも見やすさ的にもリスト内包表記を使える場所は積極的に使っていくといい。
3項演算子は単体ではあまり使う機会がないが、リスト内包表記で簡単なif文を使えて見通しが良くなる場合は積極的に使うといい。
1# リスト内包表記
2nums = [1, 2, 3, 4, 5, 6]
3nums_mul_2 = [n*2 for n in nums]
4print(nums_mul_2)
5# [2, 4, 6, 8, 10, 12]
6
7# 辞書内包表記
8list_a = ["a", "b", "c"]
9dict_a = {v: i*2 for i, v in enumerate(list_a)}
10print(dict_a)
11# {'a': 0, 'b': 2, 'c': 4}
12
13# 3項演算子
14a = 2
15num_type = "odds" if a % 2 == 1 else "even"
16print(num_type)
17# even
18
19# if文とリスト内包表記
20nums = [1, 2, 3, 4, 5, 6]
21odds = [num for num in nums if num % 2 == 1]
22print(odds)
23# [1, 3, 5]
24
25# if-else文とリスト内包表記
26nums = [1, 2, 3, 4, 5, 6]
27num_types = ["odd" if num %2 == 1 else "even" for num in nums]
28print(num_types)
29# ['odd', 'even', 'odd', 'even', 'odd', 'even']