2012-03-23 31 views
6

Có cách nào hiệu quả để tìm mục phù hợp cuối cùng trong danh sách không? Khi làm việc với các chuỗi, bạn có thể tìm thấy mục cuối cùng với rindex:Tương đương với rindex cho danh sách trong Python

>>> a="GEORGE" 
    >>> a.rindex("G") 
    4 

... Nhưng phương pháp này không tồn tại cho danh sách:

>>> a=[ "hello", "hello", "Hi." ] 
    >>> a.rindex("hello") 
    Traceback (most recent call last): 
     File "<stdin>", line 1, in <module> 
    AttributeError: 'list' object has no attribute 'rindex' 

Có cách nào để có được điều này mà không cần phải để xây dựng một vòng lặp lớn? Tôi không muốn sử dụng phương pháp ngược lại nếu nó có thể tránh được, vì thứ tự là quan trọng và tôi cũng sẽ phải làm một chút toán học bổ sung để tìm ra nơi mà các đối tượng/sẽ/đã được. Điều này có vẻ lãng phí.

Edit:

Để làm rõ, tôi cần số chỉ số của mặt hàng này.

+5

http://stackoverflow.com/questions/6890170/python-how-to-find-last-occurrence-in-a-list-in-python –

+1

Sử dụng 'đảo ngược (a) ', nó tạo một trình lặp ngược và không sửa đổi danh sách. – Dikei

+0

Dikei, bạn có thể cho tôi ví dụ như một câu trả lời không? Tôi sẽ sẵn sàng chọn nó nếu nó hoạt động. – Kelketek

Trả lời

12

Làm thế nào về:

len(a) - a[-1::-1].index("hello") - 1 

Chỉnh sửa (đưa vào chức năng như đề xuất):

def listRightIndex(alist, value): 
    return len(alist) - alist[-1::-1].index(value) -1 
+1

Tôi thích nó! Bạn nên gói nó lên trong một hàm, mặc dù. – steveha

5

này nên làm việc:

for index, item in enumerate(reversed(a)): 
    if item == "hello": 
     print len(a) - index - 1 
     break 
3

tôi đã viết một hàm Python đơn giản, và ở đây nó là:

def list_rindex(lst, item): 
    """ 
    Find first place item occurs in list, but starting at end of list. 
    Return index of item in list, or -1 if item not found in the list. 
    """ 
    i_max = len(lst) 
    i_limit = -i_max 
    i = -1 
    while i > i_limit: 
     if lst[i] == item: 
      return i_max + i 
     i -= 1 
    return -1 

Nhưng trong khi tôi đang thử nghiệm nó, EwyynTomato đã đăng một câu trả lời tốt hơn. Sử dụng máy móc "cắt" để đảo ngược danh sách và sử dụng phương thức .index().

0

Hỗ trợ start:

def rindex(lst, val, start=None): 
    if start is None: 
     start = len(lst)-1 
    for i in xrange(start,-1,-1): 
     if lst[i] == val: 
      return i 
Các vấn đề liên quan