web-dev-qa-db-ja.com

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)

これを行うためのより効率的な方法があるはずだと私には思われます。何か案は?

34
Ian Burris

リストを理解した私の最初の提案。

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

編集:

どちらが最も効率的か(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
65
ChristopheD

コードの数が少ないほど効率的ですか?

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

各部分文字列に対して関数 mapint するか、または リスト内包表記

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

上記では、Python 3.xを使用しない限り、 list を呼び出す必要はありません。 (Python 2.xではmapがリストを返し、Python 3.xではジェネレータを返します。)

3つの変数に直接割り当てることも可能です(この場合、リスト内包表記の代わりに ジェネレータ式 が行います):

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

注:fileにはビルドティンをシャドウするため、別の名前を付けることをお勧めします

これはPython 2および3で動作します


xval,yval,zval = map(int,file.split('-'))
8
John La Rooy