2009-10-15 7 views
14

Ich habe eine Folge von Daten mit dem folgenden Format: xpos-ypos-zoom (dh 8743-12083-15), die ich aufteilen und in den Variablen speichern möchte xpos, ypos und zoom. Da ich mit diesen Zahlen einige Berechnungen machen muss, möchte ich sie von Anfang an in ganze Zahlen umwandeln. Derzeit ist die Art, wie ich das tue mit dem folgenden Code:Effiziente Möglichkeit, Strings von Split-Funktion zu Ints in Python zu konvertieren

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

Es scheint mir, sollte es dies zu tun, ein effizienter Weg zu sein. Irgendwelche Ideen?

Antwort

37

Mein ursprünglicher Vorschlag mit einem Listenverständnis.

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

EDIT:

In Bezug auf die am effizientesten ist (cpu-takt) ist etwas, das immer getestet werden soll. Einige schnelle Tests auf meiner Python 2.6-Installation zeigt Karte ist wahrscheinlich der effizienteste Kandidat hier (Erstellen einer Liste von ganzen Zahlen aus einem Wert-Splitting-String). Beachten Sie, dass der Unterschied so klein ist, dass dies nicht wirklich wichtig, bis Sie diese Millionen Mal tun (und es ist eine bewährte Engpass) ...

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 
+3

map ist normalerweise schneller als das Verständnis bei Verwendung von eingebauten Funktionen und langsamer, wenn Sie eine benutzerdefinierte Funktion verwenden (einschließlich Lambda) –

5

Sie können die Funktion int auf jeder Teilkette map oder ein list comprehension verwenden: über dem Aufruf an list

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

In der nicht erforderlich ist, es sei denn, die Arbeit mit Python 3.x (In Python 2.x gibt map eine Liste zurück, in Python 3.x gibt es einen Generator zurück.)

Direkte Zuordnung zu den drei Variablen ist auch möglich (in diesem Fall eine statt einer Liste Verständnis tun):

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

tun shadows Sie Liste benötigen() aufrufen? map gibt eine Liste zurück ... –

+2

Nicht in Python 3 –

+0

interessant, noch eine Sache, die ich über p3k gelernt habe: D –

10

effizient wie in weniger Zeilen des Codes?

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

I Ich würde diese Antwort für effizient erklären, wie in "am einfachsten zu codieren und zu anderen wichtigeren Dingen überzugehen und zu verstehen, wenn ich später darauf zurück komme". Der Versuch, aus dieser speziellen Codezeile Mikrosekunden Leistung herauszuholen, ist eindeutig ein Umweg in das Tarpit of Unnecessary Optimization. – PaulMcG

+0

Dem stimme ich generell zu und das ist genau der Grund, warum ich es nicht aufgefrischt habe (obwohl ich mir der Generatorausdrücke und dergleichen bewusst bin). Aber da es sich bei der Angelegenheit um * drei * Elemente handelt, könnte es genauso gut belassen werden wie –

4

Anmerkung: Sie könnten einen anderen Namen wählen wollen file, wie es die buildtin

das funktioniert in Python 2 und 3


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