web-dev-qa-db-fra.com

Un moyen efficace de convertir des chaînes de la fonction split en ints en Python

J'ai une chaîne de données au format suivant: xpos-ypos-zoom (c'est-à-dire 8743-12083-15) que je souhaite fractionner et stocker dans les variables xpos, ypos et zoom. Comme je dois faire des calculs avec ces nombres, je voudrais les convertir en entiers dès le début. Actuellement, la façon dont je fais cela est avec le code suivant:

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

Il me semble qu'il devrait y avoir une façon plus efficace de procéder. Des idées?

34
Ian Burris

Ma suggestion originale avec une liste de compréhension.

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

MODIFIER:

Quant à savoir qui est le plus efficace (cpu-cycle) est quelque chose qui doit toujours être testé. Quelques tests rapides sur mon Python 2.6 indique map est probablement le candidat le plus efficace ici (construction d'une liste d'entiers à partir d'une chaîne divisée en valeurs). Notez que le la différence est si petite que cela n'a pas vraiment d'importance jusqu'à ce que vous le fassiez des millions de fois (et c'est un goulot d'étranglement prouvé) ...

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

efficace comme dans moins de lignes de code?

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

Vous pouvez map la fonction int sur chaque sous-chaîne, ou utiliser un liste compréhension :

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

Dans ce qui précède, l'appel à list n'est pas requis, sauf si vous travaillez avec Python 3.x. (Dans Python 2.x map renvoie une liste, dans Python 3.x il retourne un générateur.)

L'affectation directe aux trois variables est également possible (dans ce cas, une expression de générateur au lieu d'une compréhension de liste fera l'affaire):

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

note: vous voudrez peut-être choisir un nom différent pour file car il masque le buildtin

cela fonctionne en Python 2 et 3


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