Эффективный способ преобразования строк из функции split в int в Python

У меня есть строка данных со следующим форматом: xpos-ypos-zoom (т.е. 8743-12083-15), которые я хочу разделить и сохранить в переменных xpos, ypos и zoom. Поскольку мне нужно сделать некоторые вычисления с этим номером, я хотел бы преобразовать их в целые числа с самого начала. В настоящее время я делаю это со следующим кодом:

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

Мне кажется, должен быть более эффективный способ сделать это. Любые идеи?

Ответы

Ответ 1

Мое первоначальное предложение с пониманием списка.

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

EDIT:

В отношении того, что является наиболее эффективным (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

Ответ 2

эффективен, как в меньшем числе строк кода?

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

Ответ 3

Вы можете map функцию int для каждой подстроки, или используйте понимание списка:

>>> 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 он возвращает генератор.)

Также возможно прямое назначение трех переменных (в этом случае выражение вместо понимания списка будет):

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

Ответ 4

Примечание: вы можете выбрать другое имя для file, поскольку оно затеняет buildtin

это работает в Python 2 и 3


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