2015-12-23 69 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。

相关问题