web-dev-qa-db-ja.com

関数が呼び出されるリスト内包の「なし」アイテムを効率的に除外する

Noneを返す可能性のある関数を呼び出すリスト内包があります。

>>> f = lambda x: x if x < 3 else None
>>> l = [f(x) for x in [1,2,3,4]]
[1, 2, None, None]

上記のように、「なし」エントリなしでリストを理解したいのですが。

リストの理解の効率を維持しながら、追加のオーバーヘッドを作成せずに以下を実行するためのより効率的な方法は何ですか?

>>> filter(None, [f(x) for x in [1,2,3,4]])
[1, 2]
13
scrap_metal

次のように、ifを理解度に追加します。

l = [y for y in (f(x) for x in [1,2,3,4]) if y is not None]

ジェネレータ式 をリスト内包表記内に配置すると、関数を1回評価するだけで済みます。さらに、ジェネレータ式はジェネレータであるため、追加の中間ストレージは必要ありません。

16
Stephen Rauch