2013-07-12 42 views
6

Tôi biết rằng một [end: start: -1] lát một danh sách theo thứ tự ngược lại.Lập chỉ mục đảo ngược bằng Python?

Ví dụ

a = range(20) 
print a[15:10:-1] # prints [15, ..., 11] 
print a[15:0:-1] # prints [15, ..., 1] 

nhưng bạn không thể đến được với các yếu tố đầu tiên (0 trong ví dụ). Có vẻ như -1 là một giá trị đặc biệt.

print a[15:-1:-1] # prints [] 

Bất kỳ ý tưởng nào?

+0

[Các Python Slice Notation] (http://stackoverflow.com/questions/509211/ chú thích-python-slice) –

+0

Điều này cũng có thể thú vị đối với bạn: 'print (list (reversed (range (5))))' –

Trả lời

8

Bạn có thể gán biến của bạn để None:

>>> a = range(20) 
>>> a[15:None:-1] 
[15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0] 
>>> 
+1

Điều này (sử dụng 'None') có lẽ là giải pháp tốt nhất, nhưng lưu ý rằng bạn cũng có thể sử dụng các chỉ số âm xung quanh:' a [-5: -21: -1] 'đưa bạn cùng một slice, bao gồm phần tử' a [0] 'cuối cùng. – torek

+0

@torek Tôi cũng nghĩ đến việc sử dụng các chỉ số tiêu cực, nhưng tôi nghĩ đó là giải pháp tốt nhất, bởi vì bạn có thể tránh việc gán thêm cho 'None' (xem câu trả lời của tôi). –

8

Bỏ qua chỉ số cuối:

print a[15::-1] 
+0

start và end thực sự là các biến. –

+0

Tôi có cần câu lệnh if đặc biệt cho điều này không? –

+0

bạn có thể làm điều đó mà không có câu lệnh if nếu bạn không nhớ làm điều này theo hai bước: 'in a [low: high + 1] [:: - 1]' – Pablo

0

EDIT: bắt đầu và kết thúc là các biến

Tôi chưa bao giờ nhận ra điều này, nhưng một (hơi hacky) giải pháp sẽ là:

>>> a = range(5) 
>>> s = 0 
>>> e = 3 
>>> b = a[s:e] 
>>> b.reverse() 
>>> print b 
[2, 1, 0] 
+0

bắt đầu và kết thúc là các biến –

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

Vì vậy, bạn có thể thấy khi đặt giá trị trong nhãn bắt đầu: e nd: nó sẽ cung cấp cho bạn từ đầu đến cuối độc quyền [cuối].

Như bạn thấy ở đây cũng như:

>>> a[0:2:] 
[0, 1] 

-1 là giá trị cuối cùng trong một:

>>> a[len(a)-1] == a[-1] 
True 
+0

http://stackoverflow.com/a/509295/1031417 – 0x90

0

Nếu bạn sử dụng chỉ số tiêu cực bạn có thể tránh nhiệm vụ phụ, chỉ sử dụng bắt đầu và kết thúc của bạn biến:

a = range(20) 
start = 20 
for end in range(21): 
    a[start:-(len(a)+1-end):-1] 
1

Trong Python2.x, giải pháp đơn giản nhất về số lượng ký tự có lẽ nên được:

>>> a=range(20) 

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

Mặc dù tôi muốn chỉ ra rằng nếu sử dụng xrange(), việc lập chỉ mục sẽ không hoạt động vì xrange() cung cấp cho bạn một đối tượng xrange thay vì một danh sách.

>>> a=xrange(20) 
>>> a[::-1] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence index must be integer, not 'slice' 

Sau trong Python3.x, phạm vi() thực hiện những gì xrange() thực hiện trong Python2.x nhưng cũng có cải tiến chấp nhận thay đổi lập chỉ mục khi đối tượng.

>>> a = range(20) 
>>> a[::-1] 
range(19, -1, -1) 
>>> b=a[::-1] 
>>> for i in b: 
...  print (i) 
... 
19 
18 
17 
16 
15 
14 
13 
12 
11 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
0 
>>> 

sự khác biệt giữa phạm vi() và xrange() rút ra từ nguồn: http://pythoncentral.io/how-to-use-pythons-xrange-and-range/ bởi tác giả: Joey Payne

+0

Wut? Đây có phải là câu trả lời không? –

+0

Câu trả lời trực tiếp của tôi chỉ là [:: - 1]. Phần sau đây là một số biến chứng có thể xảy ra mà mọi người có thể tìm thấy nếu họ đang sử dụng phiên bản python khác nhau. Xin lỗi về sự nhầm lẫn. Tôi mới ở đây, bạn có nghĩ rằng tôi nên xóa phần trả lời không trực tiếp và nơi tôi nên đặt nó? Cảm ơn! –

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