I have a string of data with the following format: xpos-ypos-zoom (i.e. 8743-12083-15) that I want to split up and store in the variables xpos, ypos, and zoom. Since I need to do some calculations with these number I’d like to convert them to integers right from the beginning. Currently, the way I’m doing this is with the following code:
file = '8743-12083-15' xval, yval, zoom = file.split("-") xval = int(xval) yval = int(yval)
It seems to me there should be a more efficient way of doing this. Any ideas?
My original suggestion with a list comprehension.
test = '8743-12083-15' lst_int = [int(x) for x in test.split("-")]
As to which is most efficient (cpu-cyclewise) is something that should always be tested.
Some quick testing on my Python 2.6 install indicates map is probably the most efficient candidate here (building a list of integers from a value-splitted string). Note that the difference is so small that this does not really matter until you are doing this millions of times (and it is a proven bottleneck)…
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
efficient as in fewer lines of code?
(xval,yval,zval) = [int(s) for s in file.split('-')]
'8743-12083-15' list(map(int, file.split('-'))) [8743, 12083, 15] [int(d) for d in file.split('-')] [8743, 12083, 15]file =
In the above the call to
list is not required, unless working with Python 3.x. (In Python 2.x
map returns a list, in Python 3.x it returns a generator.)
Directly assigning to the three variables is also possible (in this case a generator expression instead of a list comprehension will do):
int(d) for d in file.split('-')) xval, yval, zval (8743, 12083, 15)xval, yval, zval = (
note: you might want to pick a different name for
file as it shadows the buildtin
this works in Python 2 and 3
xval,yval,zval = map(int,file.split('-'))