Realice una llamada de función en una lista de comprensión solo una vez si es necesario dos veces

Aquí una pregunta genérica de Python sobre generadores / comprensión de listas.

Para un determinado iterable x necesito una lista de comprensión que se vea así:

 [ flatten(e) for e in x if flatten(e) != '' ] 

La función de flatten es potencialmente costosa, por lo que sería bueno llamarlo solo una vez. ¿Hay una manera de hacer esto en una línea expresiva?

Anidar un generador:

 [item for item in (flatten(e) for e in x) if item != ''] 

O:

 [item for item in map(flatten, x) if item != ''] 

En realidad no … En general, te aconsejo hacerlo en 2 pasos. El primer paso se aplana, el segundo paso se filtra:

 flattened = (flatten(e) for e in x) [f for f in flattened if f] 

Podría poner el generador en la lista de comp, pero me parece que hacer eso tiende a perjudicar la legibilidad por poco beneficio (IMHO).

También podrías escribir:

 list(filter(None, map(flatten, e))) 

Pero no creo que eso sea mejor 🙂

Usa la función de map .

 [ e for e in map(flatten, x) if e != '' ]