2010-01-25 51 views

Trả lời

21

Tôi nghĩ rằng bạn đang tìm kiếm operator.itemgetter:

import operator 
line=','.join(map(str,range(11))) 
print(line) 
# 0,1,2,3,4,5,6,7,8,9,10 
alist=line.split(',') 
print(alist) 
# ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10'] 
one,four,ten=operator.itemgetter(1,4,10)(alist) 
print(one,four,ten) 
# ('1', '4', '10') 
+2

Đây là rất nhiều mã ... –

+6

Không thực sự. Nếu bạn đưa ra mã trình diễn, nó có thể trông như thế này: một, bốn, mười = toán tử.itemgetter (1,4,10) (line.split (',')) –

+0

Bạn là một phao cứu sinh, cảm ơn! Nếu timeit là đúng, điều này sẽ làm giảm thời gian chạy của một đoạn mã mà chúng tôi đã kiểm tra ngày hôm nay từ 9 giờ đến vài giây. –

8
lst = line.split(',') 
one, four, ten = lst[1], lst[4], lst[10] 
+2

Tôi nghĩ rằng bạn đã hiểu nhầm câu hỏi –

+0

@Idan: có thể tôi có, tôi không có nghĩa vụ lấy các phần tử thứ 2, thứ 5 và thứ 11 của danh sách mới không? – SilentGhost

+1

@Idan K: Không yêu cầu phiên bản "Pythonic" là một biểu thức đơn lẻ như phiên bản Perl. –

1

Có:

data = line.split(',') 
one, four, ten = data[1], data[4], data[10] 

Bạn cũng có thể sử dụng itemgetter, nhưng tôi thích mã ở trên, nó rõ ràng hơn, và rõ ràng == mã tốt.

4

Hãy thử operator.itemgetter (có sẵn trong python 2.4 hoặc mới hơn):

Return một đối tượng có thể được gọi là lấy về mục từ toán hạng của nó sử dụng phương pháp của toán hạng ____ GetItem ____(). Nếu nhiều mục được chỉ định, trả về một bộ giá trị tra cứu.

>>> from operator import itemgetter 
>>> line = ','.join(map(str, range(11))) 
>>> line 
'0,1,2,3,4,5,6,7,8,9,10' 
>>> a, b, c = itemgetter(1, 4, 10)(line.split(',')) 
>>> a, b, c 
('1', '4', '10') 

Condensed:

>>> # my ($one,$four,$ten) = line.split(/,/)[1,4,10] 
>>> from operator import itemgetter 
>>> (one, four, ten) = itemgetter(1, 4, 10)(line.split(',')) 
+0

Quyền nhập là 'từ mục nhập của nhà điều hànhgetter' –

+0

thx, đã chỉnh sửa ... – miku

+0

Bạn là một phao cứu sinh, cảm ơn! Nếu timeit là đúng, điều này sẽ làm giảm thời gian chạy của một đoạn mã mà chúng tôi đã kiểm tra ngày hôm nay từ 9 giờ đến vài giây. –

18

Sử dụng một danh sách hiểu

line = '0,1,2,3,4,5,6,7,8,9,10' 
lst = line.split(',') 
one, four, ten = [lst[i] for i in [1,4,10]] 
+1

Nó được gọi là [list comprehension] (http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions), không liệt kê nén. – Bengt

+1

Đã sửa. sống lâu. – has2k1

2

Làm thế nào về điều này:

index = [1, 0, 0, 1, 0] 
x = [1, 2, 3, 4, 5] 
[i for j, i in enumerate(x) if index[j] == 1] 
#[1, 4] 
0

Ngoài ra, nếu bạn có một mảng Numpy thay vì danh sách, bạn có thể làm một cái gì đó như:

from numpy import array 

# Assuming line = "0,1,2,3,4,5,6,7,8,9,10" 
line_array = array(line.split(",")) 

one, four, ten = line_array[[1,4,10]] 

Bí quyết ở đây là bạn có thể chuyển danh sách (hoặc mảng Numpy) làm chỉ mục mảng.

CHỈNH SỬA: Lần đầu tiên tôi nghĩ nó cũng sẽ hoạt động với bộ dữ liệu nhưng phức tạp hơn một chút. Tôi đề nghị gắn bó với danh sách hoặc mảng.

Các vấn đề liên quan