2009-10-15 7 views
14

Tengo una cadena de datos con el siguiente formato: xpos-ypos-zoom (es decir, 8743-12083-15) que quiero dividir y almacenar en las variables xpos, ypos y zoom. Como necesito hacer algunos cálculos con estos números, me gustaría convertirlos en enteros desde el principio. Actualmente, la forma en que estoy haciendo esto es con el siguiente código:Manera eficiente de convertir cadenas de función dividida a ints en Python

file = '8743-12083-15' 
xval, yval, zoom = file.split("-") 
xval = int(xval) 
yval = int(yval) 

Me parece que debería ser una manera más eficiente de hacerlo. ¿Algunas ideas?

Respuesta

37

Mi sugerencia original con una lista de comprensión.

test = '8743-12083-15' 
lst_int = [int(x) for x in test.split("-")] 

EDIT:

En cuanto a cuál es más eficiente (cpu-cyclewise) es algo que siempre debe ser probado. Algunas pruebas rápidas en mi instalación de Python 2.6 indican El mapa es probablemente el candidato más eficiente aquí (crear una lista de enteros a partir de una cadena dividida en valores). Tenga en cuenta que la diferencia es tan pequeña que esta realidad no importa hasta que usted está haciendo esto millones de veces (y es un cuello de botella probada) ...

def v1(): 
return [int(x) for x in '8743-12083-15'.split('-')] 

def v2(): 
return map(int, '8743-12083-15'.split('-')) 

import timeit 
print "v1", timeit.Timer('v1()', 'from __main__ import v1').timeit(500000) 
print "v2", timeit.Timer('v2()', 'from __main__ import v2').timeit(500000) 

> output v1 3.73336911201 
> output v2 3.44717001915 
+3

el mapa suele ser más rápido que la comprensión al utilizar funciones integradas, y más lento si está utilizando una función definida por el usuario (incluida lambda) –

5

Puede map la función int en cada subcadena, o utilizar un list comprehension:

>>> file = '8743-12083-15' 
>>> list(map(int, file.split('-'))) 
[8743, 12083, 15] 
>>> [int(d) for d in file.split('-')] 
[8743, 12083, 15] 

En lo anterior la llamada a list no se requiere, a menos que se trabaja con Python 3.x (En Python 2.x map devuelve una lista, en Python 3.x devuelve un generador.)

La asignación directa a las tres variables también es posible (en este caso un generator expression en lugar de una lista de comprensión lo hará):

>>> xval, yval, zval = (int(d) for d in file.split('-')) 
>>> xval, yval, zval 
(8743, 12083, 15) 
+0

hacer que necesita lista() llamar? map devuelve una lista ... –

+2

No en Python 3 –

+0

interesante, una cosa más que aprendí sobre p3k: D –

10

eficiente como en menos líneas de código?

(xval,yval,zval) = [int(s) for s in file.split('-')] 
+1

I Declararía que esta respuesta es eficiente como en "la más fácil de codificar y pasar a otras cosas más importantes, y para comprender cuándo volveré más tarde". Intentar alcanzar microsegundos de rendimiento a partir de esta línea de código en particular es claramente un desvío en el Tarpit de la Optimización Innecesaria. – PaulMcG

+0

Generalmente estoy de acuerdo y esa es exactamente la razón por la cual no lo retoqué (aunque estoy al tanto de las expresiones del generador y demás). Pero dado que el asunto en cuestión tiene que ver con * tres * elementos, también podría dejarlo como está –

4

nota: es posible que desee elegir un nombre diferente para file ya que las sombras de la buildtin

esto funciona en Python 2 y 3


xval,yval,zval = map(int,file.split('-')) 
Cuestiones relacionadas