内包表記が、お好きでしょ
はじめに
こんなタイトルにしているが、元々は内包表記が見にくくて理解できなかった。
しかし、一度使ってみると便利すぎてなんでも内包表記にしたくなってくる。
基本構文
例えば1~100の数列を生成する。
lst1=[i for i in range(1, 101)] lst2=[i for i in range(1, 101) if ...] lst3=[i if ... else ... for i in range(1, 101)]
ifでフィルタリング
1~100のなかでルートを取ったときに整数になる整数のみからなるリストを作りたいとする。
その場合、for
より後にifをつける。if
から後の条件がTrue
であればその数値がi
に代入されるイメージ。
[i for i in range(1, 101) if math.sqrt(i) == int(math.sqrt(i))]
ルートが2回出現して無駄感否めない。Python3.8から新しく代入式が追加されたらしい。
それを使用すれば(可読性は犠牲になるが)出現回数は1回に抑えられる。
代入式なのでスコープがリスト内だけでないことに注意しないと事故りそう。
[i for i in range(1, 101) if (rt:=math.sqrt(i)) == int(rt)] #Variable Type Data/Info #------------------------------ #math module <module 'math' (built-in)> #rt float 10.0
ナベアツ数を表示する。
[i for i in range(1, 101) if i%3 == 0 or '3' in str(i)]
if...else...
はfor
より前方に置いて使う。試しにナベアツ数の最後に'!!!'を連結させる場合は以下のようになる。
非常に読みにくい。str()
がうるさい。
[str(i)+'!!!' if i%3 == 0 or '3' in str(i) else str(i) for i in range(1, 101)]
変数i
へ加工
ナベアツで既に使ってしまっているが、変数i
は関数に放り込んだり、文字列結合したり、演算したり...色々できる。
先頭の変数i
は定数やNone
でも動作する。こうすることで静かになる。
[None if i%3 == 0 or '3' in str(i) else i for i in range(1, 101)]
リスト内でタプルも作れる。
[(i, i**2, i**3) for i in range(1, 101)]
九九表とか。
[[i*j for i in range(1, 10)] for j in range(1, 10)]