2009-10-15 15 views
14

我有一个数据字符串,格式如下:xpos-ypos-zoom(即8743-12083-15),我想分割并存储在变量中xpos,ypos和缩放。因为我需要用这些数字进行一些计算,所以我想从头开始将它们转换为整数。目前,我这样做的方法是使用下面的代码:有效的方法来将字符串从split函数转换为Python中的整数

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

在我看来,应该有这样做的更有效的方法。有任何想法吗?

回答

37

我最初的建议与清单理解。

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

编辑:

至于哪个是最有效的(CPU-cyclewise)是应该始终进行测试。 我的Python 2.6安装的一些快速测试表明地图可能是这里最有效的候选者(根据值分割字符串构建整数列表)。请注意,不同的是如此之小,这并不重要,直到你这样做是数百万次(它是一个成熟的瓶颈)...

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

使用内置函数时,映射通常比理解更快;如果使用用户定义的函数(包括lambda),映射通常会更慢; – 2009-10-15 20:30:02

5

可以map功能int每个子,或者使用list comprehension

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

在调用list上面不是必需的,除非使用Python 3.x的工作(在Python 2.x中,map返回一个列表,在Python 3.x中它返回一个生成器。)

直接指定给三个变量也是可能的(在这种情况下,generator expression而不是列表解析会做):

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

你需要的list()调用? map返回一个列表... – 2009-10-15 20:05:05

+2

不在Python 3 – 2009-10-15 20:06:46

+0

有趣的是,我学到了关于p3k的另外一件事:D – 2009-10-15 20:11:33

10

有效的代码行数较少?

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

I “我认为这个答案是有效的,因为”最容易编码并转向其他更重要的东西,并了解我什么时候再回来“。试图从这个特定的代码行消除微秒的性能显然是绕过不必要的优化的Tarpit。 – PaulMcG 2009-10-15 21:56:35

+0

我一般都认同,这正是我为什么不刷它(虽然我知道发生器表达式等)。但是,由于所讨论的问题是关于* 3个元素,因此它可能会被保留为 – 2009-10-16 20:09:16

4

记:你可能想选择一个不同的名称file因为它屏蔽了该buildtin

这部作品在Python 2和3


xval,yval,zval = map(int,file.split('-')) 
相关问题