Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

リスト内包表記なる魔界記法 その1:配列型

リスト内包表記はforをデータ型の中でブン回して新しいリスト系データをつくる方法です。
今まで何となく使ってましたが、ちゃんと名前が付いてるんですね。
正規表現みたいなモンで最初は癖があっても慣れれば簡潔かつ高速に欲しいデータを記述できます。

実際のところ

例えば……

  • 0x1 ~ 0xfの内、2の倍数のモノを二ビットシフト(四倍)したもの

なる条件を満たした配列を作るには以下のようにします。

[ x << 2 for x in range(0x1,0xf) if x%2 == 0 ]
# [8, 16, 24, 32, 40, 48, 56]

あるいは、

  • foobarという文字列の内、o以外の文字を10字"_"で右づめ……なる条件も
[x.rjust(10,"_") for x in "foobar" if x is not "o" ]
# ['_________f', '_________b', '_________a', '_________r']

これを各要素を改行して文字列として表示したい場合

print("\n".join([x.rjust(10,"_") for x in "foobar" if x is not "o" ]))
#_________f
#_________b
#_________a
#_________r

if節はin節は延々と続けることができるので、以下の様な記述も可能
shuzo-kino.hateblo.jp

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
#>> [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]

参考

単純にメソッドを実行したり、変化するクラス変数を放り込んだりする時にもスマートに記述できる。
shuzo-kino.hateblo.jp