こういう話。
fruit = ["apple", "banana", "cherry", "date", "elderberry", "fig", "grape", "honeydew"] fruit_dict = { name: len(name) for name in fruit if name.endswith("e") } print(fruit_dict) #=> {'apple': 5, 'date': 4, 'grape': 5}
辞書を返すリストだと
fruit = ["apple", "banana", "cherry", "date", "elderberry", "fig", "grape", "honeydew"] fruit_list = [ { "name": name, "name_len": len(name) } for name in fruit if name.endswith("e") ] print(fruit_list) #=> [{'name': 'apple', 'name_len': 5}, {'name': 'date', 'name_len': 4}, {'name': 'grape', 'name_len': 5}]
こうなって、ぐっとSQLのSELECTと似た見た目になる。
GROUP BY とか ORDER BY 相当の宣言的処理は書けないけど、python のリストは全部数え上げイテレータだという概念的な理解になっているのであまり不満はない。ストリームに対しての基本操作はフィルタと変換と複製であるから。
そういえば .NET の Enumerable は GroupBy()とかReverse() 書けたな...。でもあれは個人的には少し過剰だと思っている。