获取列表的最后一个元素

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

答案

some_list[-1]是最短和最 Python 的语言。

实际上,您可以使用此语法做更多的事情。 some_list[-n]语法获取第 n 个元素。因此some_list[-1]获取最后一个元素, some_list[-2]获取倒数第二个, 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索引获取列表项将引发IndexError 。这意味着,如果some_list为空,则some_list[-1]将引发异常,因为空列表不能包含最后一个元素。

如果您的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 对象更像是 “异常元素”,而不是异常对象。

您也可以这样做:

alist.pop()

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

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

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

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

在 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 像 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

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'

为了防止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'

另一种方法:

some_list.reverse() 
some_list[0]

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

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

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

next(reversed(some_list), None)