Efficiënte manier om snaren te converteren van de split-functie naar Ints in Python

Ik heb een reeks gegevens met het volgende formaat: XPOS-YOPS-zoom (d.w.z. 8743-12083-15) dat ik wil opsplitsen en opslaan in de variabelen XPOS, YPOS en ZOOM. Aangezien ik wat berekeningen nodig heb met dit nummer, zou ik ze vanaf het begin naar gehele getallen willen converteren. Momenteel is de manier waarop ik dit doe, met de volgende code:

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

Het lijkt mij dat er een efficiëntere manier moet zijn om dit te doen. Ideeën?


Antwoord 1, Autoriteit 100%

Mijn originele suggestie met een lijstbegrip.

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

bewerken:

Wat het meest efficiënt is (CPU-cycluswise) is iets dat altijd moet worden getest.
Sommige snelle testen op mijn Installatie van Python 2.6 geeft kaart aan is waarschijnlijk de meest efficiënte kandidaat hier (bouw een lijst met gehele getallen uit een waarde-splitsing). Merk op dat het verschil zo klein is dat dit niet echt uitmaakt totdat u deze miljoenen keren doet (en het is een bewezen knelpunt) …

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

Antwoord 2, Autoriteit 23%

Efficiënt als bij minder regels code?

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

Antwoord 3, Autoriteit 14%

U kunt mapde functie intop elke substring of gebruik een lijst Begrip :

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

In bovenstaande de oproep tot listis niet vereist, tenzij het werkt met Python 3.x. (In Python 2.x mapRetourneert een lijst, in Python 3.x Retourneert een generator.)

Direct toe te wijzen aan de drie variabelen is ook mogelijk (in dit geval een generator uitdrukking In plaats van een lijst begrijpen):

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

Antwoord 4, Autoriteit 12%

OPMERKING: Misschien wilt u een andere naam voor fileselecteren als het de builtin

Dit werkt in Python 2 en 3


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

Other episodes