2010-08-10 50 views
15

Vì vậy, tôi đã chơi xung quanh với python và nhận thấy một cái gì đó mà có vẻ hơi lạ. Ngữ nghĩa của -1 khi chọn từ danh sách có vẻ không nhất quán.Danh sách Python/lựa chọn danh sách con -1 weirdness

Vì vậy, tôi có một danh sách các số

ls = range(1000) 

Yếu tố cuối cùng của danh sách nếu tất nhiên ls[-1] nhưng nếu tôi phải mất một sublist điều đó vì vậy mà tôi có được mọi thứ từ nói trung điểm đến cuối cùng tôi sẽ do

ls[500:-1] 

nhưng điều này không cung cấp cho tôi danh sách chứa phần tử cuối cùng trong danh sách, nhưng thay vào đó danh sách chứa tất cả mọi thứ LÊN phần tử cuối cùng. Tuy nhiên nếu tôi làm

ls[0:10] 

tôi nhận được một danh sách có chứa cũng là yếu tố thứ mười (để chọn nên được bao gồm), tại sao sau đó nó không làm việc cho -1.

Tôi tất nhiên có thể làm ls[500:] hoặc ls[500:len(ls)] (điều này sẽ ngớ ngẩn). Tôi chỉ tự hỏi thỏa thuận với -1 là gì, tôi nhận ra rằng tôi không cần nó ở đó.

Trả lời

50

Trong list[first:last], last không được bao gồm.

Phần tử thứ 10 là ls[9], trong ls[0:10] không có ls[10].

4

tôi nhận được hành vi phù hợp cho cả hai trường hợp:

>>> ls[0:10] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> ls[10:-1] 
[10, 11, 12, 13, 14, 15, 16, 17, 18] 

Lưu ý, mặc dù, rằng yếu tố thứ mười trong danh sách là ở chỉ số , kể từ khi danh sách là 0-lập chỉ mục. Đó có thể là nơi gác máy của bạn.

Nói cách khác, [0:10] không đi từ chỉ số 0-10, nó có hiệu quả từ 0 đến phần tử thứ mười (giúp bạn lập chỉ mục 0-9, vì 10 không bao gồm ở cuối lát) .

1

Có vẻ như khá phù hợp với tôi; các chỉ số tích cực cũng không bao gồm. Tôi nghĩ bạn đang làm sai. Nhớ rằng phạm vi() cũng không bao gồm và các mảng Python được lập chỉ mục 0, đây là phiên python mẫu để minh họa:

>>> d = range(10) 
>>> d 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> d[9] 
9 
>>> d[-1] 
9 
>>> d[0:9] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> d[0:-1] 
[0, 1, 2, 3, 4, 5, 6, 7, 8] 
>>> len(d) 
10 
1

khi cắt mảng;

ls[y:x] 

lấy lát từ phần tử y tối đa và không bao gồm x. khi bạn sử dụng các chỉ mục tiêu cực nó tương đương với sử dụng

ls[y:-1] == ls[y:len(ls)-1] 

vì thế nên lát sẽ là tối đa yếu tố cuối cùng, nhưng nó sẽ không bao gồm nó (theo slice)

2

-1 isn không đặc biệt theo nghĩa là trình tự được đọc ngược, nó khá quấn quanh đầu. Như vậy trừ một nghĩa là không trừ đi một, độc quyền (và, đối với một giá trị bước dương, chuỗi được đọc "từ trái sang phải".

như vậy cho i = [1, 2, 3, 4], i[2:-1] nghĩa từ mục hai để đầu trừ một (hoặc, 'xung quanh để khi kết thúc'), mà kết quả trong [3]. Yếu tố -1th, hoặc yếu tố 0 ngược 1 là người cuối cùng 4, nhưng vì nó là độc quyền, chúng tôi nhận 3.

Tôi hy vọng điều này có phần dễ hiểu.

10

Nếu bạn muốn có được một danh sách phụ bao gồm các yếu tố cuối cùng, bạn để trống sau khi ruột:

>>> ll=range(10) 
>>> ll 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
>>> ll[5:] 
[5, 6, 7, 8, 9] 
>>> ll[:] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
Các vấn đề liên quan