2009-10-15 35 views
14

Tôi có một chuỗi dữ liệu có định dạng sau: xpos-ypos-zoom (tức là 8743-12083-15) mà tôi muốn chia nhỏ và lưu trữ trong các biến xpos, ypos và zoom. Vì tôi cần thực hiện một số phép tính với số này, tôi muốn chuyển đổi chúng thành số nguyên ngay từ đầu. Hiện tại, cách tôi thực hiện điều này là với mã sau:Cách hiệu quả để chuyển đổi chuỗi từ hàm tách thành int trong Python

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

Dường như với tôi có cách hiệu quả hơn để thực hiện việc này. Ý tưởng nào?

Trả lời

37

Đề xuất ban đầu của tôi với danh sách hiểu.

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

EDIT:

Khi mà là hiệu quả nhất (cpu-cyclewise) là cái gì đó nên luôn luôn được kiểm tra. Một số thử nghiệm nhanh trên bản cài đặt Python 2.6 của tôi cho biết bản đồ có lẽ là ứng cử viên hiệu quả nhất ở đây (xây dựng danh sách các số nguyên từ chuỗi được chia tách giá trị). Lưu ý rằng sự khác biệt là quá nhỏ rằng điều này không thực sự quan trọng cho đến khi bạn đang làm điều này hàng triệu lần (và nó là một nút cổ chai đã được kiểm chứng) ...

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

bản đồ thường nhanh hơn hiểu khi sử dụng hàm dựng sẵn và chậm hơn nếu bạn đang sử dụng hàm do người dùng xác định (bao gồm lambda) –

5

Bạn có thể map chức năng int trên mỗi chuỗi, hoặc sử dụng một list comprehension:

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

Trong phía trên lệnh gọi đến list là không cần thiết, trừ khi làm việc với Python 3.x. (Trong Python 2.x map trả về một danh sách, trong Python 3.x nó trả về một trình tạo.)

Trực tiếp gán cho ba biến cũng có thể (trong trường hợp này là generator expression thay vì một danh sách sẽ hiểu):

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

làm bạn cần list() gọi? bản đồ trả về một danh sách ... –

+2

Không có trong Python 3 –

+0

thú vị, một điều nữa tôi đã học về p3k: D –

10

hiệu quả như trong ít dòng mã hơn?

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

I 'd tuyên bố câu trả lời này để có hiệu quả như trong "dễ nhất để mã và chuyển sang các công cụ quan trọng khác, và để hiểu khi tôi trở lại với nó sau này". Cố gắng để eke ra micro giây hiệu suất từ ​​dòng mã cụ thể này rõ ràng là một đường vòng vào Tarpit của Tối ưu hóa không cần thiết. – PaulMcG

+0

Tôi thường đồng ý và đó là chính xác lý do tại sao tôi đã không đánh nó lên (mặc dù tôi nhận thức được các biểu thức máy phát điện và tương tự). Nhưng, vì vấn đề được đề cập là khoảng * ba * phần tử, nó có thể được để lại như là –

4

lưu ý: bạn có thể muốn chọn một tên khác cho file vì nó bóng tối các buildtin

làm việc này bằng Python 2 và 3


xval,yval,zval = map(int,file.split('-')) 
Các vấn đề liên quan