在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有一个函数用于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 "", line 1, in
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 "", line 2, in
File "", 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