Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

リスト内包表記なる魔界記法 その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)]