freedom-_-qの勉強履歴

メモ書きが主になるかと思います。勉強強制のために一日一記事目指してます。頭良くないので間違いが多々あるかと思います。

内包表記が、お好きでしょ

はじめに

こんなタイトルにしているが、元々は内包表記が見にくくて理解できなかった。
しかし、一度使ってみると便利すぎてなんでも内包表記にしたくなってくる。

基本構文

例えば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)]