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

#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[-1]为空,则some_list将引发异常,因为空列表不能包含最后一个元素。

评论


我想念some_list.last之类的东西-这将是一段漂亮的代码

–德米特里P.
1月20日15:41

#2 楼

如果您的str()list()对象最终可能是空的:astr = ''alist = [],那么您可能想要对对象“ sameness”使用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:]可能是一种有效的方法,因为它返回与astr [-1]相同的类型,但是我认为':'不能处理空列表(问题在于列表) 。如果要使用“ alist [-1:]”作为条件而不是“ len(alist)> 0”,那么我认为使用后者更容易理解。 (如果我错过了一些事情,很高兴投票)

– Stan Kurdziel
2015年6月7日下午6:27

您的投反对票是可以理解且有效的。但是,我发现针对异常对象的用途有两个基本阵营。可以肯定的是,异常会暂停您的应用程序。一个阵营在try子句中使用异常,因为另一阵营将使用if len(alist)> 0:结构代替。无论如何,异常是使代码暂停的对象。因此,对我来说,序列对象要少一些,然后返回的“空”序列不会停止您的代码。我的首选是使用IF子句测试“空”对象,而不是使用try子句暂停我的代码的对象。

–DevPlayer
15年6月8日在20:58

由于切片语法值得讨论,因此表示支持,但是我同意@StanKurdziel的观点,即形态是错误的,您只是在移动球门柱-我发现我自己的解决方案与主要用途有关,如果您不这样做,则将其添加到列表中“尚未添加”(三角形折线图),因此如果len(my_vector)== 0或my_vector [-1]!= update_val的组合表达式是可行的模式。但这肯定不是全局解决方案-最好使用语法形式,其中无结果

–马克·穆林(Mark Mullin)
17 Mar 5 '17 at 20:16

xs [-1]如果xs else无

–加百列
18年4月28日在2:35

为什么要“避免” IndexError?如果尝试索引空列表或字符串,则会出现异常。如果要处理该异常,请使用try / except -这就是它的作用。

–克里斯·约翰逊(Chris Johnson)
18年8月1日在2:18

#3 楼

您还可以执行以下操作:

alist.pop()


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

#4 楼

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

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


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

评论


如果列表长度为零,则此解决方案在list [-1]出错时起作用。

–anon01
18年2月15日在18:42

什么?你为什么要做一个[-1:] [0]?无论如何,他也提供了[-1]。请解释一下?

– kaboom
19年1月3日,下午4:52

#5 楼


在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绑定到不必要的新ly创建的列表:

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


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

*_, last = a_list


或者,实际上,如果您知道它是一个列表(或至少接受下标符号):

last = a_list[-1]


在函数中

评论者说:


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

定义起来非常简单:

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


#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]


#9 楼

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

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

评论


假设通常不建议对原始列表进行更改,这可能是一个很糟糕的假设,因为毕竟毕竟是很常见的

–亚伦
16年1月1日在11:34

#10 楼

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

next(reversed(some_list), None)


#11 楼

好的,但是几乎在每种语言中都常见吗?这是IMO获得最后一个元素的最简单方法,因为它不需要任何Python知识。

评论


items [len(items)-1]本质上是Python在后台执行的操作,但是由于序列的len已经存储在序列中,因此无需对其进行计数,因此您正在做的工作量超出必要。

–丹·盖尔(Dan Gayle)
2015年10月10日,0:25

由于您正在编写Python,因此您确实应该尝试变得更加Pythonic

–吴彦祖
2015年10月27日,下午3:35

@MichaelWu没有这样做的意义。 Python的方式通常不是不言自明的,在必须引入新人进行项目开发时需要多加注意,并且,当您必须切换到其他语言(如Java)时,这种方式当然行不通-您不能使用Python专有的知识。如果您尽可能地省略pythonic方式,那么几个月/几年后返回项目也将变得更加容易。

–拉德克·阿努谢夫斯基(Radek Anuszewski)
15年10月31日在14:13

@Pneumokok您说的很对,但我认为与索引生成器相比,列表索引是一种非常基本的Python技术。另外,如果您不打算使用各个语言工具和语法,为什么还要使用C或javascript之外的其他东西呢?然后,您可以在所有项目中始终坚持用辛苦的方式做所有事情。

–马修·普顿(Matthew Purdon)
15年12月3日在15:30

尽管它不是很pythonic,但我认为它在某些方面要比some_list [-1]方法更好,因为它更具逻辑性,并且在我看来,它显示的实际性能要优于some_list [-1]。

–拜伦文件管理器
16年11月4日在21:08

#12 楼

这是您查询的解决方案。
a=["first","middle","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
>>> middle


#13 楼

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