7

我希望在序列“s”中找到项目“x”的最后一次出现,或者如果没有并且第一项的位置等于 0,则返回 None

这是我目前拥有的:

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。我对这是如何发生的感到困惑,如果有人能解释我需要纠正的内容,我将不胜感激。我也想用最基本的代码来完成这个。

谢谢你。

4

8 回答 8

6

为了有效地做到这一点,以相反的顺序枚举列表并返回第一个匹配项的索引(或默认情况下),例如:None

def PositionLast(x, s):
    for i, v in enumerate(reversed(s)):
        if v == x:
            return len(s) - i - 1  # return the index in the original list
    return None

避免使用切片表示法(例如s[::-1])反转列表,因为这会在内存中创建一个新的反转列表,这对于任务来说不是必需的。

于 2015-12-23T15:34:52.150 回答
3

您的逻辑不正确,因为您返回计数 ifi==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
于 2015-12-23T15:36:39.337 回答
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。
- 巧合的是,这是最后一个项目的索引。

于 2015-12-23T15:39:52.603 回答
2

以相反的顺序迭代列表,然后检查 x。这可能是一种有效的方法,因为反转列表然后从头开始查找索引是资源密集型的。

def PositionLast (x,s):
    for i in range(len(s)-1,0,-1):
        if s[i] == x:
            return i
    return None
于 2015-12-23T15:40:42.427 回答
1
def positionLast(x, L):
    answer = None
    for i,e in enumerate(L):
        if e==x: answer = i
    return answer
于 2015-12-23T15:34:16.063 回答
0

感谢大家的回复和帮助!不幸的是,没有人知道我正在寻找的答案,但无论我最终自己解决了问题,但仍然非常感谢你!

这是最终代码:

def PositionLast(x,s):

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

这将返回我所有测试的正确答案。

谢谢,艾米尔。

于 2015-12-24T20:13:16.303 回答
0
def positionLast(x, L):
    try: return max(i for i,e in enumerate(L) if e==x)
    except: return None
于 2015-12-23T19:00:51.297 回答
-2
def lastposition(array,x):

    flag = 0
    for i in range(len(array)):
        if array[i] == int(x):
            x = i
            flag = 1
        else:
            pass
    if flag == 0:
        print 'None'
    else:
        print x

array = [2,5,2,3,5]

x = 2

lastposition(array,x)
于 2018-07-09T17:24:42.463 回答