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?
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
efficace comme dans moins de lignes de code?
(xval,yval,zval) = [int(s) for s in file.split('-')]
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)
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('-'))