リスト内包表現

Python のサンプルコードで、よく次のような書き方を見かけます。

[f(x) for x in col]

この書き方、「リスト内包表現」と呼びます。これを初めて見たとき、私は何をやっているのか全く分かりませんでした。

調べてみると、どうやら次の処理を行うようです。

  1. col の各要素を x に代入
  2. f(x) を評価
  3. f(x) の結果を集めた配列を返す

C# で同じ処理をするなら、次のように書けます。

col.Select(x => f(x));

左から右に読めるぶん、こちらが分かりやすい。慣れもあるでしょうがw

このリスト内包表現、次のように書けば、集める要素を絞り込めます。

[f(x) for x in col if g(x)]

ここでやっていることは次の通り。

  1. col の各要素を x に代入
  2. g(x) を評価
  3. g(x) が成立する要素だけ、f(x) を評価
  4. f(x) の結果を集めた配列を返す

これも、C# で同じ処理をするなら、次のように書けます。

col.Where(x => g(x)).Select(x => f(x));

やっぱり、こちらが分かりやすい。

内包表現では右から左へ評価するので、英語に近いですね。でも私は英語に強くないので、C# みたいに左から右へ評価する方が読みやすいな。