2015-12-23 67 views
5

我希望找到序列's'中項目'x'的最後一次出現,或者如果沒有並且第一項的位置相同則返回None 0查找列表中某個項目的最後一次出現python

這是我目前有:

def PositionLast (x,s): 

    count = len(s)+1 
    for i in s: 
     count -= 1 
     if i == x: 
      return count 
    for i in s: 
     if i != x: 
      return None 

當我嘗試:

>>>PositionLast (5, [2,5,2,3,5]) 
>>> 4 

這是正確的答案。然而,當我改變「x」至2,而不是5我得到這個:

>>>PositionLast(2, [2,5,2,3,5]) 
>>> 5 

這裏的答案應該是2 我很困惑,這是怎麼發生的,如果有人可以給我所需要的解釋正確的我會很感激。 我也想用最基本的代碼來完成這個。

謝謝。

+0

[在Python中查找列表中的某個值的第一個和最後一個索引]可能的重複(http://stackoverflow.com/questions/522372/finding-first-and-last-index-of-some-value- IN-A-列表中的Python) –

回答

1
def positionLast(x, L): 
    answer = None 
    for i,e in enumerate(L): 
     if e==x: answer = i 
    return answer 
5

它的憐憫名單沒有rindex方法,但你可以使用index

last = len(s) - s[::-1].index(x) - 1 

或等價

for i, v in enumerate(reversed(s)): 
    if v == x: 
     last = len(s) - i - 1 
     break 
3

你的邏輯是不正確的,因爲你返回計數如果i==x和你有一個額外的循環在你的功能尾隨。

相反,你遍歷列表中羅列的反轉形態,並返回第一次出現的指標:

def PositionLast (x,s): 
    return next(i for i,j in list(enumerate(s))[::-1] if j == x) 

演示:

print PositionLast (2, [2,5,2,3,5,3]) 
2 
print PositionLast (3, [2,5,2,3,5,3]) 
5 
print PositionLast (5, [2,5,2,3,5,3]) 
4 
2

你的代碼是錯誤的,它是檢查從列表在第一場比賽中開始和停止,你想要的是以相反的順序檢查列表。

def PositionLast (x,s): 
    count = len(s) 
    for i in s[::-1]: 
     count -= 1 
     if i == x: 
      return count 
    return None 

你的第一線爲您提供了正確的答案只有巧合的是因爲:
- 的第一個項目檢查時計數等於5。
- 計數等於4時檢查第二個項目,它匹配,然後返回4.
- 巧合的是,這是您的最後一個項目的索引。

2

按相反順序迭代列表,然後檢查x。這可能是一種有效的方式,因爲反轉列表然後從頭開始查找索引是資源密集型的。

def PositionLast (x,s): 
    for i in range(len(s)-1,0,-1): 
     if s[i] == x: 
      return i 
    return None 
0
def positionLast(x, L): 
    try: return max(i for i,e in enumerate(L) if e==x) 
    except: return None 
0

感謝大家的答覆和幫助!不幸的是,沒有人有我正在尋找的答案,但無論我最終自己做了什麼,但非常感謝你!

下面是最終代碼:

def PositionLast(x,s): 

    count = -1 
    position = None 
    for i in s: 
     count += 1 
     if i == x: 
      position = count 
    return position 

這將返回正確的答案,我的所有測試。

謝謝,Eimear。

相關問題