2012-04-25 9 views
10

Primero, por favor, perdóneme por el título algo pobre. No estaba muy seguro de cómo decirlo. Si alguien pudiera sugerir un título mejor, sería genial.Comprensiones de la lista de Python División del bucle variable

Estoy tratando de averiguar si hay una forma 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 cadena

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

Y me gustaría realizar esta:

>>> [(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 divide en tres ocasiones . Así que algo como esto (¿Qué es la sintaxis, obviamente, no válida, pero es de esperar es suficiente para hacer llegar el mensaje):

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

En esta pregunta soy no buscando formas de fantasía para conseguir la segunda y tercera columna de la cadena . Es solo una manera de proporcionar un ejemplo concreto. Que pude por supuesto, para el ejemplo de su uso:

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

Las posibles soluciones que he pensado:

  1. no utiliza una lista por comprensión
  2. dejarlo como está
  3. Uso del csv.DictReader , nombre mis columnas y algo así como StringIO para darle la entrada.

Esto es más que nada un patrón agradable de usar en lugar de un caso específico, por lo que es difícil responder al "por qué quieres hacer esto" o "para qué sirve esto".

Gracias de antemano :)

ACTUALIZACIÓN: Después de estar por debajo de la lectura de la solución que fui y encontré algunas pruebas de velocidad. Y encontré en mis pruebas muy básicas que la solución provista fue un 35% más rápida que la solución anterior.

Respuesta

16

Se podría utilizar una lista por comprensión envuelto alrededor de un generador de expresión:

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

gracias muy fresco :) – Nick

Cuestiones relacionadas