2009-10-15 20 views
14

Aşağıdaki formatta bir veri dizim var: xpos-ypos-zoom (yani 8743-12083-15) değişkenleri bölmek ve saklamak istiyorum xpos, ypos ve zoom. Bu sayı ile bazı hesaplamalar yapmam gerektiğinden, başlangıçtan itibaren tam sayılara dönüştürmek istiyorum. Şu anda, bu yapıyorum yolu aşağıdaki kodla geçerli: Bana öyle geliyorDizeleri bölünmüş işlevden Python'daki ints'e dönüştürmenin etkili yolu

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

Bunu yapmanın daha verimli bir şekilde olmalıdır. Herhangi bir fikir?

cevap

37

Orijinal önerim, bir liste anlama ile.

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

DÜZENLEME:

daima test edilmesi gereken bir şey (cpu-cyclewise) en verimli olduğu için olduğu gibi. Python 2.6 kurulumumdaki bazı hızlı testler haritasında haritasının muhtemelen en verimli aday olduğunu gösteriyor (bir değer dizgesinden tamsayıların listesini oluşturmak). ... fark bu gerçekten zamanların bu milyonlarca yapıyoruz (ve kanıtlanmış bir darboğaz) dek fark etmez o kadar küçük olduğunu

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

haritasının olduğu gibi bırakılabilir, çünkü bir yerleşik fonksiyonlar kullanılırken kavramadan daha hızlıdır ve kullanıcı tanımlı bir fonksiyon kullanıyorsanız (lambda dahil) –

5

Her alt dize üzerinde fonksiyonunu intmap veya list comprehension kullanabilirsiniz: Python 3.x ile çalışmak sürece, gerekli değildir list çağrısının üzerinde ise

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

(Python 3.x, listesini döndürür map Python 2.x yılında bir jeneratör döner.) Üç değişkenlere atama

Doğrudan

da mümkündür (bir generator expression listesi yerine anlama yapacak bu durumda):

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

listeyi gerekiyor gölgeler olarak file() diyoruz? harita bir liste döndürür ... –

+2

Python 3'te değil –

+0

ilginç, p3k hakkında öğrendiğim bir şey daha: D –

10

Kod daha az satırdaki kadar verimli mi?

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

'da çalışmaya devam edeceğim diye endişelenmeyin. Bu cevabı "kodlamak ve diğer önemli şeylere geçmek için en kolay olanı" olarak ve daha sonra tekrar geldiğimi anlamak için etkili olarak beyan ederim. Bu özel kod satırındaki performansın mikrosaniyesini bir araya getirmeye çalışmak, gereksiz Optimizasyon Tarpasına doğru bir sapmadır. – PaulMcG

+0

Genel olarak katılıyorum ve tam olarak neden bu yüzden fırçalamadım (jeneratör ifadelerinin ve benzerlerinin farkında olmamam da). Ancak, söz konusu olan konu yaklaşık üç * eleman olduğu için –

4

not Not: için farklı bir ad çeker diye o buildtin

bu Python 2 çalışır ve 3


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