web-dev-qa-db-fra.com

Filtrer efficacement les éléments «Aucun» dans une liste de compréhension dans laquelle une fonction est appelée

J'ai une compréhension de liste qui appelle une fonction qui retourne potentiellement None.

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

J'aimerais avoir la compréhension de la liste comme ci-dessus, sans les entrées "Aucune".

Quelle est la manière la plus efficace de procéder comme suit, sans créer de surcharge supplémentaire et tout en conservant l'efficacité de la compréhension de la liste?

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

Ajoutez un if dans votre compréhension comme:

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

En plaçant un expression de générateur dans la compréhension de la liste, vous n'aurez besoin d'évaluer la fonction qu'une seule fois. De plus, l'expression du générateur est un générateur et ne nécessite donc aucun stockage intermédiaire supplémentaire.

16
Stephen Rauch