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 map
de functie int
op 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 list
is niet vereist, tenzij het werkt met Python 3.x. (In Python 2.x map
Retourneert 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 file
selecteren als het de builtin
Dit werkt in Python 2 en 3
xval,yval,zval = map(int,file.split('-'))