题 在Python中获取列表的最后一个元素


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


1392
2018-05-30 19:28


起源




答案:


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]

2219
2018-05-30 19:29



它导致0长度列表中的错误,该数组超出索引 - Black Mamba
@BlackMamba:零长度列表没有元素,因此它们也没有最后一个(或第一个或其他)元素,因此访问empty_list [-1]显然是一个错误。 - Kai Petzke


如果你的 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对象更像是“最后一个元素”,然后是异常对象。


182
2017-11-09 23:26



Downvoted,因为我觉得这个答案的核心是不正确的。当你想要一个元素时获取一个列表只会推迟不可避免的“列表索引超出范围” - 这就是尝试从空列表中获取元素时应该发生的事情。对于字符串astr [-1:]可能是一个有效的方法,因为它返回与astr [-1]相同的类型,但我不认为':'有助于处理空列表(问题是关于列表) 。如果想要使用“alist [-1:]”作为条件而不是“len(alist)> 0”,我认为使用后者更具可读性。 (如果我错过了什么,我很乐意投票) - Stan Kurdziel
你投票是可以理解和有效的。但是我发现有两个关于异常对象的基本阵营。可以肯定的是,异常会暂停您的应用。一个阵营在try子句中使用异常,因为另一阵营将使用if len(alist)> 0:结构。无论如何,异常是停止代码的对象。因此对我来说就是更少的序列对象,就像返回“null”一样,这些序列不会停止你的代码。我的偏好是使用IF子句来测试“null”对象而不是停止使用try子句抢占我的代码的对象。 - DevPlayer
Upvoted是因为切片语法值得讨论,但是我同意@StanKurdziel的形态是错误的,你只是移动了球门柱 - 我发现我自己的解决方案与'如果你没有'将这个添加到列表中的主要用途有关“已经添加了它”(增量线图),所以组合表达式 if len(my_vector) == 0 or my_vector[-1] != update_val 是一种可行的模式。但它肯定不是一个全局解决方案 - 如果有一个语法形式,其中None是结果,那就太好了 - Mark Mullin
赞成这次讨论的纯粹的迷恋价值。 - vwvan
xs[-1] if xs else None - Gabriel


你也可以这样做:

alist.pop()

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


68
2018-05-30 22:21





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

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

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


54
2017-08-20 17:41



如果列表长度为零,则此解决方案可以正常运行 list[-1] 会错的。 - anon01


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

要获得最后一个元素,

  • 没有修改列表,和
  • 假设你知道清单 具有 最后一个元素(即它是非空的)

通过 -1 下标符号:

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

说明

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

我修改了一个例子 来自文档 指示每个索引引用的序列中的哪个项,在本例中为字符串 "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有一个函数用于first()和last(),就像Lisp一样......它将摆脱许多不必要的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

21
2018-06-23 22:05



优秀的解释,这应该是最高投票 - psrpsrpsr


mylist = [ 1 , 2 , 3 , 4 , 5]

#------------------------------------
# Method-1 : Last index
#------------------------------------

print(mylist[-1])


#------------------------------------
# Method-2 : Using len 
#------------------------------------

print(mylist[len(mylist) - 1])


#------------------------------------
# Method-3 : Using pop, pop will remove the last 
#            element from the list.
#------------------------------------

print(mylist.pop())

6
2018-02-21 09:06





如果你想要 得到 列表的最后一个值,您应该使用:

your_list[-1]

 如果你想 得到 价值也是 去掉 从列表中,您可以使用:

your_list.pop()

要么: 你也可以弹出索引...

your_list.pop(-1)

5
2017-10-13 12:32