Lista de comprensión de división de bucle variable

Primero por favor perdóname por el título algo pobre. No estaba muy segura de cómo redactarlo. Si alguien pudiera sugerir un mejor título sería genial.

Estoy tratando de descubrir si hay una manera de dividir el valor de cada iteración de una lista de comprensión solo una vez, pero usarla dos veces en la salida. Un ejemplo del problema que estoy tratando de resolver es:

Tengo la cuerda

a = "1;2;4\n3;4;5" 

Y me gustaría realizar esto:

 >>> [(x.split(";")[1],x.split(";")[2]) for x in a.split("\n") if x.split(",")[1] != 5] [('2', '4'), ('4', '5')] 

Sin la necesidad de correr split tres veces. Así que algo como esto (que obviamente es una syntax no válida, pero espero que sea suficiente para transmitir el mensaje):

 [(x[1],x[2]) for x.split(";") in a.split("\n") if x[1] != 5] 

En esta pregunta no busco formas extravagantes de obtener la segunda y tercera columna de la cadena. Es solo una forma de dar un ejemplo concreto. Podría por supuesto usar el ejemplo:

 [x.split(";")[1:3] for x in a.split("\n")] 

Las posibles soluciones que he pensado:

  1. No utilizar una lista de comprensión.
  2. Dejarlo como está
  3. Use csv.DictReader , nombre mis columnas y algo como StringIO para darle entrada.

Esto es principalmente algo que sería un buen patrón para poder usar en lugar de un caso específico, por lo que es difícil responder el “por qué quieres hacer esto” o “para qué sirve esto”.

Actualización: Después de leer la solución a continuación, fui y realicé algunas pruebas de velocidad. Y encontré en mis pruebas muy básicas que la solución proporcionada era un 35% más rápida que la solución ingenua de arriba.

Podría usar una lista de comprensión envuelta alrededor de una expresión generadora:

 [(x[1],x[2]) for x in (x.split(";") for x in a.split("\n")) if x[1] != 5]