【问题标题】:如何获取列表的最后一个元素
【发布时间】:2010-10-30 03:30:33
【问题描述】:

在 Python 中,如何获取列表的最后一个元素?

【问题讨论】:

    标签: python list indexing


    【解决方案1】:

    some_list[-1] 是最短和最 Pythonic 的。

    事实上,你可以用这个语法做更多的事情。 some_list[-n] 语法获取倒数第 n 个元素。所以some_list[-1] 得到最后一个元素,some_list[-2] 得到倒数第二个,以此类推,一直到some_list[-len(some_list)],它给了你第一个元素。

    您也可以通过这种方式设置列表元素。例如:

    >>> some_list = [1, 2, 3]
    >>> some_list[-1] = 5 # Set the last element
    >>> some_list[-2] = 3 # Set the second to last element
    >>> some_list
    [1, 3, 5]
    

    请注意,如果预期的项目不存在,按索引获取列表项将引发IndexError。这意味着如果some_list 为空,some_list[-1] 将引发异常,因为空列表不能有最后一个元素。

    【讨论】:

      【解决方案2】:

      你也可以这样做:

      last_elem = alist.pop()
      

      这取决于您想对列表做什么,因为pop() 方法将删除最后一个元素。

      【讨论】:

      • 注意:值得知道这也会从列表中删除最后一个元素。
      【解决方案3】:

      如果您的 str()list() 对象可能最终为空:astr = ''alist = [],那么您可能希望使用 alist[-1:] 而不是 alist[-1] 来表示对象“相同性”。

      这里的意义在于:

      alist = []
      alist[-1]   # will generate an IndexError exception whereas 
      alist[-1:]  # will return an empty list
      astr = ''
      astr[-1]    # will generate an IndexError exception whereas
      astr[-1:]   # will return an empty str
      

      区别在于返回空列表对象或空 str 对象更像是“最后一个元素”——而不是异常对象。

      【讨论】:

      • 投了反对票,因为我觉得这个答案的核心是不正确的。当你想要一个元素时获取一个列表只会推迟不可避免的“列表索引超出范围”——这就是尝试从空列表中获取元素时应该发生的情况。对于字符串 astr[-1:] 可能是一种有效的方法,因为它返回与 asr[-1] 相同的类型,但我不认为 ':' 有助于处理空列表(问题是关于列表) .如果想法是使用“alist[-1:]”作为条件而不是“len(alist) > 0”,我认为使用后者更具可读性。 (如果我错过了什么,很高兴投票)
      • 你投反对票是可以理解和有效的。但是,我发现关于异常对象的用途有两个基本阵营。可以肯定的是,异常会停止您的应用程序。一个阵营在 try 子句中使用异常,因为另一个阵营将使用 if len(alist)>0: 结构。无论如何,异常是停止您的代码的对象。因此,对我而言,序列对象较少,例如返回的“null”序列,它们不会停止您的代码。我的偏好是使用 IF 子句来测试“空”对象,而不是使用 try 子句抢占我的代码的对象。
      • 赞成,因为切片语法值得讨论,但我同意@StanKurdziel 的观点,即形态错误,你只是在移动球门柱 - 我发现我自己的解决方案与 ' 的主要用途有关如果您还没有添加它,请将其添加到列表中'(增量线图),因此组合表达式 if len(my_vector) == 0 or my_vector[-1] != update_val 是一种可行的模式。但这肯定不是一个全球性的解决方案——如果有一个结果为 None 的语法形式会很好
      • xs[-1] if xs else None
      • 为什么要“避免”IndexError?如果你试图索引一个空列表或字符串,你会得到一个异常。如果您想处理该异常,请使用 try/except -- 这就是它的用途。
      【解决方案4】:

      在python中显示最后一个元素的最简单方法是

      >>> list[-1:] # returns indexed value
          [3]
      >>> list[-1]  # returns value
          3
      

      还有许多其他方法可以实现这样的目标,但这些方法都很简短且易于使用。

      【讨论】:

      • 如果您的列表长度为零,则此解决方案有效,而list[-1] 将出错。
      【解决方案5】:

      好的,但是在几乎所有语言方式中都很常见items[len(items) - 1] 呢?这是 IMO 获取最后一个元素的最简单方法,因为它不需要任何 pythonic 知识。

      【讨论】:

      • items[len(items) - 1] 本质上是 Python 在幕后所做的,但由于序列的 len 已经存储在序列中,因此无需计算它,你重新创造了不必要的工作。
      • 既然你在写 Python,你真的应该尝试更 Pythonic
      • @MichaelWu 这样做没有意义。 Pythonic 方式通常不是不言自明的,需要更多注意您必须向项目介绍新人的地方,当然,当您必须切换到 Java 等其他语言时,它就行不通了——您不能使用 Python 特定的知识。当您尽可能省略 pythonic 方式时,几个月/几年后返回项目也容易得多。
      • @Pneumokok 你说得很有道理,但我认为与生成器相比,列表索引是一种 非常 基本的 Python 技术。此外,如果您不打算利用单独的语言工具和语法,为什么还要使用 C 或 javascript 以外的任何东西呢?然后,您可以在所有项目中始终如一地以艰难的方式完成所有工作。
      • 虽然它不是很pythonic,但我认为这在某些方面比some_list[-1] 方法更好,因为它更合乎逻辑,并且在我看来它实际上比some_list[-1] 做得更好。跨度>
      【解决方案6】:

      另一种方法:

      some_list.reverse() 
      some_list[0]
      

      【讨论】:

      • 这是一个简单的方法,您也可以在 O(n) 上执行相同的操作,即使您可以选择在 O(1) 上执行。
      【解决方案7】:

      list[-1] 将检索列表的最后一个元素而不更改列表。 list.pop() 将检索列表的最后一个元素,但它会改变/更改原始列表。通常,不建议更改原始列表。

      或者,如果由于某种原因,您正在寻找不那么 Python 的东西,您可以使用 list[len(list)-1],假设列表不为空。

      【讨论】:

      • 假设通常不建议对原始列表进行变异可能是不好的,因为毕竟它很常见
      【解决方案8】:

      如果您不想在列表为空时得到IndexError,也可以使用下面的代码。

      next(reversed(some_list), None)
      

      【讨论】:

        【解决方案9】:

        在 Python 中,如何获取列表的最后一个元素?

        要获取最后一个元素,

        • 不修改列表,并且
        • 假设您知道列表最后一个元素(即非空)

        -1 传递给下标符号:

        >>> a_list = ['zero', 'one', 'two', 'three']
        >>> a_list[-1]
        'three'
        

        说明

        索引和切片可以将负整数作为参数。

        我修改了一个示例from the documentation,以指示每个索引引用序列中的哪个项目,在这种情况下,在字符串"Python"-1 中引用最后一个元素,字符,'n'

         +---+---+---+---+---+---+
         | P | y | t | h | o | n |
         +---+---+---+---+---+---+
           0   1   2   3   4   5 
          -6  -5  -4  -3  -2  -1
        
        >>> p = 'Python'
        >>> p[-1]
        'n'
        

        通过可迭代解包分配

        为了获取最后一个元素,此方法可能不必要地实现第二个列表,但为了完整性(并且因为它支持任何可迭代 - 不仅仅是列表):

        >>> *head, last = a_list
        >>> last
        'three'
        

        变量名,head绑定到不必要的新建列表中:

        >>> head
        ['zero', 'one', 'two']
        

        如果您不打算对该列表执行任何操作,则更合适:

        *_, last = a_list
        

        或者,真的,如果你知道它是一个列表(或者至少接受下标符号):

        last = a_list[-1]
        

        在函数中

        一位评论者说:

        我希望 Python 有一个像 Lisp 一样的 first() 和 last() 函数……它会摆脱很多不必要的 lambda 函数。

        这些定义很简单:

        def last(a_list):
            return a_list[-1]
        
        def first(a_list):
            return a_list[0]
        

        或者使用operator.itemgetter:

        >>> import operator
        >>> last = operator.itemgetter(-1)
        >>> first = operator.itemgetter(0)
        

        无论哪种情况:

        >>> last(a_list)
        'three'
        >>> first(a_list)
        'zero'
        

        特殊情况

        如果您正在做一些更复杂的事情,您可能会发现以稍微不同的方式获取最后一个元素会更高效。

        如果您是编程新手,则应避免使用此部分,因为它将算法的其他语义不同部分耦合在一起。如果你在一个地方改变你的算法,它可能会对另一行代码产生意想不到的影响。

        我尝试尽可能完整地提供警告和条件,但我可能遗漏了一些东西。如果您认为我会留下警告,请发表评论。

        切片

        列表的切片返回一个新列表 - 因此,如果我们想要新列表中的元素,我们可以从 -1 切片到末尾:

        >>> a_slice = a_list[-1:]
        >>> a_slice
        ['three']
        

        如果列表为空,这样做的好处是不会失败:

        >>> empty_list = []
        >>> tail = empty_list[-1:]
        >>> if tail:
        ...     do_something(tail)
        

        而尝试通过索引访问会引发需要处理的IndexError

        >>> empty_list[-1]
        Traceback (most recent call last):
          File "<stdin>", line 1, in <module>
        IndexError: list index out of range
        

        但同样,只有在需要时才应为此目的进行切片:

        • 创建了一个新列表
        • 如果之前的列表为空,则新列表为空。

        for 循环

        作为 Python 的一项功能,for 循环中没有内部范围。

        如果您已经对列表执行了完整的迭代,最后一个元素仍将被循环中分配的变量名引用:

        >>> def do_something(arg): pass
        >>> for item in a_list:
        ...     do_something(item)
        ...     
        >>> item
        'three'
        

        从语义上讲,这不是列表中的最后一件事。这在语义上是名称 item 所绑定的最后一件事。

        >>> def do_something(arg): raise Exception
        >>> for item in a_list:
        ...     do_something(item)
        ...
        Traceback (most recent call last):
          File "<stdin>", line 2, in <module>
          File "<stdin>", line 1, in do_something
        Exception
        >>> item
        'zero'
        

        因此,这应该只用于获取最后一个元素,如果你

        • 已经在循环,并且
        • 您知道循环将完成(不会因错误而中断或退出),否则它将指向循环引用的最后一个元素。

        获取和删除它

        我们还可以通过删除并返回最后一个元素来改变我们的原始列表:

        >>> a_list.pop(-1)
        'three'
        >>> a_list
        ['zero', 'one', 'two']
        

        但现在原始列表已被修改。

        -1实际上是默认参数,所以list.pop可以不带索引参数使用):

        >>> a_list.pop()
        'two'
        

        只有在以下情况下才这样做

        • 您知道列表中有元素,或者如果列表为空,则准备处理异常,并且
        • 您确实打算从列表中删除最后一个元素,将其视为堆栈。

        这些是有效的用例,但不是很常见。

        将其余部分保存以备后用:

        我不知道你为什么要这样做,但为了完整起见,因为 reversed 返回一个 iterator(它支持迭代器协议),你可以通过其结果为next:

        >>> next(reversed([1,2,3]))
        3
        

        所以这就像做相反的事情:

        >>> next(iter([1,2,3]))
        1
        

        但我想不出这样做的充分理由,除非您稍后需要反向迭代器的其余部分,它可能看起来更像这样:

        reverse_iterator = reversed([1,2,3])
        last_element = next(reverse_iterator)
        
        use_later = list(reverse_iterator)
        

        现在:

        >>> use_later
        [2, 1]
        >>> last_element
        3
        

        【讨论】:

          【解决方案10】:

          lst[-1] 是最好的方法,但是对于一般的可迭代对象,请考虑more_itertools.last

          代码

          import more_itertools as mit
          
          
          mit.last([0, 1, 2, 3])
          # 3
          
          mit.last(iter([1, 2, 3]))
          # 3
          
          mit.last([], "some default")
          # 'some default'
          

          【讨论】:

            【解决方案11】:

            要防止IndexError: list index out of range,请使用以下语法:

            mylist = [1, 2, 3, 4]
            
            # With None as default value:
            value = mylist and mylist[-1]
            
            # With specified default value (option 1):
            value = mylist and mylist[-1] or 'default'
            
            # With specified default value (option 2):
            value = mylist[-1] if mylist else 'default'
            

            【讨论】:

              【解决方案12】:

              这是您的查询的解决方案。

              a=["first","second from last","last"] # A sample list
              print(a[0]) #prints the first item in the list because the index of the list always starts from 0.
              print(a[-1]) #prints the last item in the list.
              print(a[-2]) #prints the last second item in the list.
              

              输出:

              >>> first
              >>> last
              >>> second from last
              

              【讨论】:

                【解决方案13】:

                如果您执行my_list[-1],则返回列表的最后一个元素。负序列索引表示从数组末尾开始的位置。负索引表示从末尾开始,-1 表示最后一项,-2 表示倒数第二项,以此类推。

                【讨论】:

                  【解决方案14】:

                  为避免出现“IndexError: list index out of range”,可以使用这段代码。

                  list_values = [12, 112, 443]
                  
                  def getLastElement(lst):
                      if len(lst) == 0:
                          return 0
                      else:
                          return lst[-1]
                  
                  print(getLastElement(list_values))
                  

                  【讨论】:

                  • 这个解决方案的问题是在len(lst) == 0的情况下,当你在等待一个int时,它会返回一个字符串。
                  • 我的意思是这个方法适用于给定的数据类型。它不能用于所有类型的列表。但也不错。
                  【解决方案15】:

                  您只需要获取并放置 [-1] 索引。例如:

                  list=[0,1,2]
                  last_index=list[-1]
                  print(last_index)
                  

                  你会得到 2 作为输出。

                  【讨论】:

                    【解决方案16】:

                    Python 方式

                    假设我们有一个列表a = [1,2,3,4],在 Python 中可以操作 List 来给我们它的一部分或其中的一个元素,使用以下命令可以轻松获取最后一个元素。

                    print(a[-1])
                    

                    【讨论】:

                    【解决方案17】:

                    在 Python 中访问列表中的最后一个元素:

                    1:使用负索引访问最后一个元素-1

                    >> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
                    >> data[-1]
                    'w'
                    

                    2。使用 pop() 方法访问最后一个元素

                    >> data = ['s','t','a','c','k','o','v','e','r','f','l','o','w']
                    >> data.pop()
                    'w'
                    

                    然而,pop 方法会从列表中删除最后一个元素。

                    【讨论】:

                    • 虽然是真的,但.pop 具有破坏性(正如其他答案所阐明的那样)。它不仅会从列表中获取最后一项,还会将其从列表中删除
                    【解决方案18】:

                    找不到任何提及这一点的答案。所以添加。

                    你也可以试试some_list[~0]

                    那是 波浪号 符号

                    【讨论】:

                      【解决方案19】:

                      您可以将它与nextiter[::-1] 一起使用:

                      >>> a = [1, 2, 3]
                      >>> next(iter(a[::-1]))
                      3
                      >>> 
                      

                      【讨论】:

                        【解决方案20】:

                        奇怪的是还没有人发布这个:

                        >>> l = [1, 2, 3]
                        >>> *x, last_elem = l
                        >>> last_elem
                        3
                        >>> 
                        

                        打开包装。

                        【讨论】:

                          【解决方案21】:

                          也可以使用长度来获取最后一个元素:

                          last_elem = arr[len(arr) - 1]
                          

                          如果列表为空,您将收到 IndexError 异常,但您也可以通过 arr[-1] 获得该异常。

                          【讨论】:

                            猜你喜欢
                            • 2022-11-15
                            • 2018-08-25
                            • 1970-01-01
                            • 2021-08-10
                            • 2013-06-19
                            • 2018-12-01
                            • 2017-02-18
                            • 1970-01-01
                            • 1970-01-01
                            相关资源
                            最近更新 更多