【问题标题】:How do I get the last element of a list?如何获取列表的最后一个元素?
【发布时间】:2022-11-15 06:21:33
【问题描述】:

如何获取列表的最后一个元素?

首选哪种方式?

alist[-1]
alist[len(alist) - 1]

【问题讨论】:

    标签: 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] 将引发异常,因为空列表不能有最后一个元素。

    【讨论】:

    • 您也可以使用 reverse 方法,但最后一个元素将在运行时返回。
    【解决方案2】:

    如果您的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 子句抢占我的代码的对象。
    • 赞成是因为 slice 语法值得讨论,但是我同意@StanKurdziel 的观点,形态学是错误的,你只是在移动球门柱——我发现我自己的解决方案与主要用途有关“如果你不这样做,请将其添加到列表中” “已经添加它”(增量线图),因此组合表达式 if len(my_vector) == 0 or my_vector[-1] != update_val 是一种可行的模式。但它肯定不是一个全局解决方案——如果有一个 None 是结果的语法形式会很好
    • xs[-1] if xs else None
    • 你为什么要“避免”IndexError?如果您尝试索引一个空列表或字符串,您将得到一个异常。如果您想处理该异常,请使用 try/except——这就是它的用途。
    【解决方案3】:

    你也可以这样做:

    last_elem = alist.pop()
    

    这取决于您要对列表执行的操作,因为 pop() 方法将删除最后一个元素。

    【讨论】:

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

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

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

    还有许多其他方法可以实现这样的目标,但这些方法都很简短,而且用起来很贴心。

    【讨论】:

    • 如果您的列表长度为零,则此解决方案有效,而 list[-1] 将出错。
    • @anon01 但要获取值,您必须访问返回的列表,并且 Index 超出范围。所以这个优势并不重要。
    【解决方案5】:

    在 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 返回一个迭代器(它支持迭代器协议)你可以将它的结果传递给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
    

    【讨论】:

    • 这个答案获得了我见过的最长答案的奖励,并且具有很高的字率解决方案!
    • 一个小问题:在 Python 中,索引被认为是在字符串中的字符之间。
    【解决方案6】:

    要防止 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'
    

    【讨论】:

      【解决方案7】:

      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'
      

      【讨论】:

        【解决方案8】:

        另一种方法:

        some_list.reverse() 
        some_list[0]
        

        【讨论】:

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

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

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

        【讨论】:

        • 假设通常不推荐改变原始列表可能是不好的,因为毕竟,这是非常普遍的
        【解决方案10】:

        这是您查询的解决方案。

        a=["first","second","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 second item in list 
        print(a[-1]) #prints the last item in the list.
        print(a[-2]) #prints the second last item in the list.
        

        输出:

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

        【讨论】:

          【解决方案11】:

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

          next(reversed(some_list), None)
          

          【讨论】:

            【解决方案12】:

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

            【讨论】:

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

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

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

            打开包装。

            【讨论】:

            • 一直在徘徊如何为多个方法返回执行此操作——从没想过我会在这个随机问题上找到答案。给你金星,哈哈。
            • 同上金星。
            【解决方案14】:

            您可以使用 ~ 运算符从末尾获取第 i 个元素(从 0 开始索引)。

            lst=[1,3,5,7,9]
            print(lst[~0])
            

            【讨论】:

              【解决方案15】:

              Pythonic 方式

              因此,让我们考虑一下我们有一个列表a = [1,2,3,4],在 Python 中可以操作列表来为我们提供它的一部分或其中的一个元素,使用以下命令可以轻松获取最后一个元素。

              print(a[-1])
              

              【讨论】:

              【解决方案16】:

              在 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 是破坏性的(正如其他答案所阐明的那样)。它不仅从列表中获取最后一项,还将它从列表中删除
              【解决方案17】:

              方法一:

              L = [8, 23, 45, 12, 78]
              print(L[len(L)-1])
              

              方法二:

              L = [8, 23, 45, 12, 78]
              print(L[-1])
              

              方法三:

              L = [8, 23, 45, 12, 78]
              L.reverse() 
              print(L[0])
              

              方法四:

              L = [8, 23, 45, 12, 78]
              print(L[~0])
              

              方法 5:

              L = [8, 23, 45, 12, 78]
              print(L.pop())
              

              都在输出78

              【讨论】:

              • ***** 解释得很好。 *****
              【解决方案18】:

              为避免“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 时,它会返回一个字符串。
              • 我的意思是说这个方法适用于给定的数据类型。它不能用于所有类型的列表。但这不是一个糟糕的答案。
              【解决方案19】:

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

              last_elem = arr[len(arr) - 1]
              

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

              【讨论】:

                【解决方案20】:

                如果您使用负数,它将开始为您提供列表最后一个元素 例子

                lst=[1,3,5,7,9]
                print(lst[-1])
                

                结果

                9
                

                【讨论】:

                  【解决方案21】:

                  如果你这样做 my_list[-1] 这将返回列表的最后一个元素。负序列索引表示从数组末尾开始的位置。负索引表示从末尾开始,-1 表示最后一项,-2 表示倒数第二项,依此类推。

                  【讨论】:

                    【解决方案22】:

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

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

                    您将得到 2 作为输出。

                    【讨论】:

                      【解决方案23】:

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

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

                      【讨论】:

                      • 谢谢!我将它与像这样复制的熊猫一起使用:duplicated = df.duplicated(subset=["Full Name"],keep=False) data_read5 = next(iter(duplicated[::-1]))
                      【解决方案24】:
                      array=[1,2,3,4,5,6,7]
                      last_element= array[len(array)-1]
                      last_element
                      

                      另一个简单的解决方案

                      【讨论】:

                      • 这是我有时使用的另一种不同的解决方案。
                      【解决方案25】:

                      找不到任何提到这个的答案。所以添加。

                      你也可以试试some_list[~0]

                      那是代字号象征

                      【讨论】:

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