2012-04-18 60 views
36

thể trùng lặp:
Traverse a list in reverse order in PythonLàm thế nào để đảo ngược tuples bằng Python?

Đây có phải là có thể? Không cần phải có mặt, chỉ cần tìm cách để đảo ngược một bộ tuple để tôi có thể lặp lại nó.

+4

Các bạn đã thử sử dụng 'reversed'? – Wes

+0

Có rất nhiều bản sao của câu hỏi này, nhưng tất cả họ dường như được hỏi về chuỗi hoặc danh sách istead của tuples. Câu trả lời là như nhau. Ví dụ: http://stackoverflow.com/questions/931092/reverse-a-string-in-python http://stackoverflow.com/questions/6827413/reverse-does-not-work-on-a-python-literal http://stackoverflow.com/questions/529424/traverse-a-list-in-reverse-order-in-python – agf

+1

Cảm ơn yeah tôi không thể tìm thấy một trong đó chính xác nói về đảo ngược tuples nhưng tôi thấy những gì bạn có ý nghĩa. –

Trả lời

87

Có hai cách thành ngữ để làm điều này:

reversed(x) # returns an iterator 

hoặc

x[::-1] # returns a new tuple 

Kể từ tuples là không thay đổi, không có cách nào để đảo ngược một tuple tại chỗ.


Edit: xây dựng trên bình luận @ LVC, sự lặp lại bởi reversed sẽ tương đương với

def myreversed(seq): 
    for i in range(len(x) - 1, -1, -1): 
     yield seq[i] 

tức là nó dựa trên chuỗi có chiều dài được biết đến để tránh phải thực sự đảo ngược tuple.

Vì nó hiệu quả hơn, tôi nghi ngờ nó sẽ là seq[::-1] nếu bạn đang sử dụng tất cả và tuple nhỏ, và reversed khi tuple lớn, nhưng hiệu suất trong python thường gây ngạc nhiên đo nó!

+0

Cảm ơn, cái nào sẽ nhanh hơn? Âm thanh như iterator lặp lại theo yêu cầu? Nếu vậy, làm thế nào để làm điều này một cách hiệu quả mà không đảo ngược danh sách đầu tiên? Nó đảo ngược mỗi lần nó lặp lại? –

+2

@JoanVenge 'reversed' sử dụng thực tế là' tuple' là chuỗi để bắt đầu ở cuối và làm việc ngược, cho mỗi phần tử theo yêu cầu trong khi theo dõi vị trí của nó. – lvc

+1

@JoanVenge xem chỉnh sửa của tôi (ty lvc, chỉ cần mở rộng nhận xét của bạn) – tobyodavies

9

Bạn có thể sử dụng hàm dựng sẵn reversed.

>>> x = (1, 2, 3, 4) 
>>> y = reversed(x) 
>>> tuple(y) 
(4, 3, 2, 1) 

Nếu bạn chỉ muốn lặp qua các tuple, bạn chỉ có thể sử dụng iterator được trả về bởi reversed trực tiếp mà không cần chuyển đổi nó thành một tuple một lần nữa.

>>> for k in reversed(x): 
...  print k, 
... 
4 3 2 1 
6

Tương tự như cách bạn sẽ đảo ngược một danh sách, ví dụ: s [:: - 1]

In [20]: s = (1, 2, 3) 

In [21]: s[::-1] 
Out[21]: (3, 2, 1) 

In [24]: for i in s[::-1]: 
    ....:  print i 
    ....: 
3 
2 
1 
Các vấn đề liên quan