2016-02-27 78 views
2

任何人都可以請解釋如何從列表中的幾個最相同的值索引輸出最右邊的索引?如何獲取最後一次出現的列表作爲輸出?

我的功能:

def last_index(xs,key): 
i = 0 
    for i in range(len(xs)): 
     if xs[i] == key: 
      if i != len(xs): 
       return i    
      else: 
       return 'None' 

例如,

xs = [3,4,5,6,4,4,5]     
key = 4        

最右邊的指數輸出應該是一個單一的5,但我得到了所有三個個個它們是指數1,4,5。 感謝您的幫助,對不起,我是全新的。

如果什麼輸入像字符串:

xs=[True,True,True,False] 
key = True 

我相信,輸出爲2?

+0

我認爲問題是關於列表 – AlokThakur

+0

計數鍵發生HTTP的重複://stackoverflow.com/questions/6890170/how-to-find-the-last-occurrence-of-an-item-in-a-python-list – SPKoder

+0

@AlokThakur是的。我太快讀了這個問題。我的錯。我收回了它。 – idjaw

回答

3

這種簡單的解決方案應該做到:

def last_index(xs, key): 
    index = None 
    for i in xrange(len(xs)): 
     if xs[i] == key: 
      index = i # override index, result in the rightmost index of key 
    return index # returns None if key is not on the list 

更有效的方式來做到這一點是從最終迭代開始並返回索引時關鍵是找到,在最壞的情況下 - 關鍵是沒有找到,我們將遍歷整個列表。

檢查出更有效的版本:

def last_index(xs, key): 
    index = None 
    for i in xrange(len(xs)-1, 0, -1): # iterate from last item to first 
     if xs[i] == key: 
      index = i 
      break # found the rightmost index, exit the loop 
    return index 

通知你應該更喜歡使用xrange超過range(除非python 3其中range等於xrange),也避免了在項目涉及不同類型看到舍甫琴科的邊緣情況answer

+0

非常感謝!沒有想到重寫! – markzzzz

+0

@markzzzz你會循環思想列表超過需要,遍歷相反的順序 –

+0

@AndriyIvaneyko更新了答案。 – Forge

0

可以撤消列表,然後使用.index()

index = xs[len(xs) - list(reversed(xs)).index(key)] 

順便說一句,在你的第二個列表,TrueFalse是布爾值,而不是字符串。

1

你可以嘗試這樣的函數

def last_index(xs,key): 
    index = -1 
    for i in range(len(xs)): 
     if xs[i] == key: 
      index=i   
    if index!=-1: 
     return index 
    else: 
     return "none" 

這將讓你的密鑰相匹配的最後一個索引。如果沒有將返回「無」。

1

這應該做的伎倆:

def last_index(xs,key): 
    index = -1 
    for i in range(len(xs)): 
     if xs[i] != key: 
      continue 
     else: 
      index = i 
    return index if index != -1 else 'None' 
1

特拉弗斯XS相反的順序並返回第一個匹配值,與reversed功能:

def last_index(xs,key): 
    for i in reversed(range(len(xs))): 
     if xs[i] == key: 
      return i 


xs = [3,4,5,6,4,4,5] 
key = 4 
print last_index(xs, key) # output: 5 

xs=[True,True,True,False] 
key = True 
print last_index(xs, key) # output: 2 
print last_index(xs, 2) # output: None 

注#1

您可以使用xrange而不是range它會給你更好的性能,並且不會因爲python3而被棄用,請參閱Should you always favor xrange() over range()?瞭解更多信息。

您的比較可以通過更換

if xs[i] == key 

if xs[i] == key and type(a) == type(b) 

注#2

爲了避免錯誤,當你1 == True將返回True但是你想你的索引來提高指數1不存在,比較兩種情況下的結果,如果xs和key有條件的話下面

xs=[True,True,True,False] 
key = 1 

值有關行爲的詳細信息,請參閱Strict comparison

+0

只需要注意,如果他使用python 3,那麼他必須使用範圍(xrange在python 3中不再存在)。 –

+0

@哈德良感謝,指出那一刻。 –

0

迭代從背後是這樣的:

def last_index(xs,key): 
    i= len(xs)-1 
    while i >=0: 
     if xs[i] == key: 
      return i 
     i -= 1 

這樣,如果該鍵不存在,該函數將返回none值

相關問題