在Python中将字符串从split函数转换为int的高效方法

blc*_*llo 29 python variables casting

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

file = '8743-12083-15'
xval, yval, zoom  = file.split("-")
xval = int(xval)
yval = int(yval)
Run Code Online (Sandbox Code Playgroud)

在我看来应该有一个更有效的方法来做到这一点.有任何想法吗?

Chr*_*heD 62

我的原始建议与列表理解.

test = '8743-12083-15'
lst_int = [int(x) for x in test.split("-")]
Run Code Online (Sandbox Code Playgroud)

编辑:

至于哪个是最有效的(cpu-cyclewise)应该总是被测试.对我的Python 2.6安装进行一些快速测试表明map可能是最有效的候选者(从值分割字符串构建整数列表).请注意,差异是如此之小,以至于在您这样做数百万次之前这并不重要(而且这是一个经证实的瓶颈)......

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
Run Code Online (Sandbox Code Playgroud)

  • 使用内置函数时,map通常比理解更快,如果使用用户定义的函数(包括lambda),则map更慢 (3认同)

Bar*_*ski 14

在更少的代码行中有效吗?

(xval,yval,zval) = [int(s) for s in file.split('-')]
Run Code Online (Sandbox Code Playgroud)

  • 我会声明这个答案是有效的,因为“最容易编码并继续进行其他更重要的事情,并且稍后我回到它时可以理解”。试图从这行特定的代码中获得微秒级的性能显然是绕道进入不必要优化的 Tarpit。 (3认同)

Ste*_*202 10

您可以在每个子字符串上使用map该函数int,或使用列表解析:

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

在上面list,除非使用Python 3.x,否则不需要调用.(在Python 2.x中map返回一个列表,在Python 3.x中它返回一个生成器.)

也可以直接分配三个变量(在这种情况下,生成器表达式而不是列表推导将执行):

>>> xval, yval, zval = (int(d) for d in file.split('-'))
>>> xval, yval, zval
(8743, 12083, 15)
Run Code Online (Sandbox Code Playgroud)

  • 不是在Python 3中 (2认同)
  • 不用担心,如果要将map()分配给元组,它仍然可以在Python 3中使用 (2认同)

Joh*_*ooy 8

注意:您可能想要选择一个不同的名称,file因为它会影响buildtin

这适用于Python 2和3


xval,yval,zval = map(int,file.split('-'))
Run Code Online (Sandbox Code Playgroud)