查找列表python

时间:2015-12-23 15:30:58

标签: python list position last-occurrence

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

这就是我目前所拥有的:

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

谢谢。

8 个答案:

答案 0 :(得分:6)

为了有效地执行此操作,enumeratereverse顺序排列并返回第一个匹配项的索引(默认情况下为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])反转列表,因为这会在内存中创建一个新的反转列表,这对于任务来说不是必需的。

答案 1 :(得分: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 :(得分: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.
- 巧合的是,这是你最后一项的索引。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

def positionLast(x, L):
    try: return max(i for i,e in enumerate(L) if e==x)
    except: return None

答案 6 :(得分:0)

感谢大家的回复和帮助!不幸的是没有人得到我想要的答案,但无论我最终自己解决了什么,但非常感谢你们!

以下是最终代码:

def PositionLast(x,s):

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

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

谢谢,Eimear。

答案 7 :(得分:-2)

public class BoxCreatedHandler : INotificationHandler<BoxCreated>
{
    private readonly IBoxRepository _repo;

    public BoxCreatedHandler(IBoxRepository repo)
    {
        _repo = repo;
    }

    public async Task Handle(BoxCreated e, CancellationToken ct)
    {
        Box b = JsonConvert.DeserializeObject<Box>(e.Data);
        _repo.CreateBox(b);

        // QUESTION: do I just go ahead and do my stock and location update here using another injected repo? 
        // Or should I register another handler for this event that does the update?

        // todo: how to handle read db update errors here? Will need to queue a aggregate replay to rebuild the read db?
    }
}