2010-05-03 45 views
6

Cú pháp lập chỉ mục mở rộng được đề cập trong tài liệu của python.Vấn đề với cú pháp slice danh sách trong python

slice([start], stop[, step]) 

Đối tượng lát cũng được tạo khi cú pháp lập chỉ mục mở rộng được sử dụng. Ví dụ: a[start:stop:step] hoặc a[start:stop, i]. Xem itertools.islice() để biết phiên bản thay thế trả về một trình lặp.

a[start:stop:step] hoạt động như mô tả. Nhưng còn cái thứ hai thì sao? Nó được sử dụng như thế nào?

+2

Vì vậy, bạn đang yêu cầu gì 'i' có nghĩa là trong "một [bắt đầu: dừng lại, i]"? –

+0

Vâng, "i" là gì nếu được cho là một chuỗi? – Dingle

+0

'a' không nhất thiết là một chuỗi của một trong các kiểu nguyên thủy mặc định. – Amber

Trả lời

10

a[start:stop,i] gọi phương thức a.__getitem__(slice(start,stop,None),i).

Điều này làm tăng TypeError nếu a là một danh sách, nhưng đó là ký hiệu hợp lệ và hữu ích nếu a là mảng có nhiều mảng. Trong thực tế, tôi tin rằng các nhà phát triển của Numpy đã yêu cầu các nhà phát triển của Python mở rộng ký hiệu cắt hợp lệ Python chính xác để ký hiệu cắt mảng có thể được thực hiện dễ dàng hơn.

Ví dụ,

import numpy as np 
arr=np.arange(12).reshape(4,3) 
print(arr) 
# [[ 0 1 2] 
# [ 3 4 5] 
# [ 6 7 8] 
# [ 9 10 11]] 

1:3 chọn hàng 1 và 2, và 2 chọn cột thứ ba:

print(arr[1:3,2]) 
# [5 8] 

PS. Để thử nghiệm với những gì lát là nhận được gửi đến __getitem__, bạn có thể chơi xung quanh với mã đồ chơi này:

class Foo(list): 
    def __getitem__(self,key): 
     return repr(key) 

foo=Foo(range(10)) 
print(foo[1:5,1,2]) 
# (slice(1, 5, None), 1, 2) 
+0

Tôi hiểu. Về cơ bản, một [start: stop, i] chỉ hoạt động với các mảng đa chiều như được thực hiện theo dạng khối. – Dingle

+0

@Dingle: Hoặc, bạn có thể định nghĩa các lớp của riêng bạn bằng '__getitem__' và gán ý nghĩa và hành vi của riêng bạn! – unutbu

+0

Câu hỏi này tương tự như http://stackoverflow.com/questions/752602/slicing-in-python-expressions-documentation, nhưng ví dụ và mã đồ chơi của bạn dễ theo dõi hơn nhiều. – Dingle

3

Ký hiệu [:,:] được sử dụng để cắt multidimensional arrays. Mặc định, Python không có bất kỳ mảng đa chiều nào, nhưng cú pháp hỗ trợ nó và numpy ví dụ tận dụng cú pháp này.

+2

Và bất kỳ đối tượng tùy chỉnh nào khác có khả năng triển khai thực hiện cắt đa chiều thông qua '__getitem __()'. – Amber

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