Bye Bye Moore

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

Pythonのリスト型は最低一個のfor句さえあればif句も、追加のfor句も追加できる

今日も元気にPython中のRubyist、shuzoです。
これがpythonistaの日常なのかも知れませんが、メモ。


Pythonの公式ドキュメントで、インスタンスに対するメソッドのリストをだすこんな処理が書かれていました。

[d for d in dir([]) if '__' not in d]
#>> ['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

……なんやこれは(激怒
dは繰り返し処理のための一時変数なんでしょうが、なんで何度もdが出てくるの……

livescriptの時にその片鱗に触れた事はありましたが……
shuzo-kino.hateblo.jp

この辺り、公式によると

リスト内包表記は、括弧の中の 式、 for 句、そして0個以上の for か if 句で構成されます。リスト内包表記の実行結果は、 for と if 句のコンテキスト中で式を評価した結果からなる新しいリストです。

5. データ構造 — Python 3.5.1 ドキュメント

最低限一個のfor句さあれば、その後にif句があろうが、追加のfor句があろうが成立し得るんですね。
実際、こんな例が載ってました。

[(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)]

ループ文を使わないで済むので、上手く使えば行数の削減が出来る構文なのかも知れません。