【问题标题】:finding the last occurrence of an item in a list python在列表python中查找最后一次出现的项目
【发布时间】:2016-03-30 01:53:23
【问题描述】:

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

谢谢。

【问题讨论】:

标签: python list position last-occurrence


【解决方案1】:

为了有效地做到这一点,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])反转列表,因为这会在内存中创建一个新的反转列表,这对于任务来说不是必需的。

【讨论】:

    【解决方案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)
    

    【讨论】:

    • 你需要解释为什么这是解决方案
    【解决方案3】:

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

    这是最终代码:

    def PositionLast(x,s):
    
        count = -1
        position = None
        for i in s:
            count += 1
            if i == x:
                position = count
        return position
    

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

    谢谢,艾米尔。

    【讨论】:

      【解决方案4】:
      def positionLast(x, L):
          try: return max(i for i,e in enumerate(L) if e==x)
          except: return None
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

          你的代码是错误的,它是从头开始检查列表并在第一个匹配时停止,你想要的是以相反的顺序检查列表。

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

          你的第一行给你正确的答案只是因为巧合:
          - 检查第一项时计数等于 5。
          - 检查第二个项目时计数等于 4,它匹配,然后返回 4。
          - 巧合的是,这是您最后一项的索引。

          【讨论】:

            【解决方案7】:

            您的逻辑不正确,因为如果 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
            

            【讨论】:

              【解决方案8】:
              def positionLast(x, L):
                  answer = None
                  for i,e in enumerate(L):
                      if e==x: answer = i
                  return answer
              

              【讨论】:

                猜你喜欢
                • 2011-10-16
                • 1970-01-01
                • 1970-01-01
                • 2020-04-19
                • 2011-10-22
                • 2020-09-08
                • 2020-11-10
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多