Python のサンプルコードで、よく次のような書き方を見かけます。
[f(x) for x in col]
この書き方、「リスト内包表現」と呼びます。これを初めて見たとき、私は何をやっているのか全く分かりませんでした。
調べてみると、どうやら次の処理を行うようです。
- col の各要素を x に代入
- f(x) を評価
- f(x) の結果を集めた配列を返す
C# で同じ処理をするなら、次のように書けます。
col.Select(x => f(x));
左から右に読めるぶん、こちらが分かりやすい。慣れもあるでしょうがw
このリスト内包表現、次のように書けば、集める要素を絞り込めます。
[f(x) for x in col if g(x)]
ここでやっていることは次の通り。
- col の各要素を x に代入
- g(x) を評価
- g(x) が成立する要素だけ、f(x) を評価
- f(x) の結果を集めた配列を返す
これも、C# で同じ処理をするなら、次のように書けます。
col.Where(x => g(x)).Select(x => f(x));
やっぱり、こちらが分かりやすい。
内包表現では右から左へ評価するので、英語に近いですね。でも私は英語に強くないので、C# みたいに左から右へ評価する方が読みやすいな。