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

Jan*_*usz 1871 python indexing list

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

Sas*_*gov 2855

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]
Run Code Online (Sandbox Code Playgroud)

请注意,IndexError如果预期的项目不存在,则按索引获取列表项将引发一个项目.这意味着some_list[-1]如果some_list为空则会引发异常,因为空列表不能包含最后一个元素.

  • 我错过了像“some_list.last”这样的东西 - 这将是一行漂亮的代码 (48认同)

Dev*_*yer 231

如果您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
Run Code Online (Sandbox Code Playgroud)

区别在于返回空列表对象或空str对象更像是"最后一个元素",然后是异常对象.

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

Tau*_*son 86

你也可以这样做:

alist.pop()
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:值得注意的是,这也会从列表中删除最后一个元素。 (9认同)

Atu*_*ind 65

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

>>> list[-1:] # returns indexed value
    [3]
>>> list[-1]  # returns value
    3
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您的列表长度为零,则此解决方案有效,而 `list[-1]` 会出错。 (3认同)

Aar*_*all 45

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

要获得最后一个元素,

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

传递-1给下标符号:

>>> a_list = ['zero', 'one', 'two', 'three']
>>> a_list[-1]
'three'
Run Code Online (Sandbox Code Playgroud)

说明

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

我修改了文档中的一个示例,以指示每个索引引用的序列中的哪个项目,在本例中为字符串"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'
Run Code Online (Sandbox Code Playgroud)

通过可迭代解包进行分配

为了获得最后一个元素,此方法可能不必要地实现第二个列表,但为了完整性(并且因为它支持任何可迭代 - 而不仅仅是列表):

>>> *head, last = a_list
>>> last
'three'
Run Code Online (Sandbox Code Playgroud)

变量名称head绑定到不必要的新创建列表:

>>> head
['zero', 'one', 'two']
Run Code Online (Sandbox Code Playgroud)

如果您打算对该列表不采取任何措施,那么这将更合适:

*_, last = a_list
Run Code Online (Sandbox Code Playgroud)

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

last = a_list[-1]
Run Code Online (Sandbox Code Playgroud)

在一个功能

评论者说:

我希望Python有一个函数用于first()和last(),就像Lisp一样......它将摆脱许多不必要的lambda函数.

这些定义非常简单:

def last(a_list):
    return a_list[-1]

def first(a_list):
    return a_list[0]
Run Code Online (Sandbox Code Playgroud)

或使用operator.itemgetter:

>>> import operator
>>> last = operator.itemgetter(-1)
>>> first = operator.itemgetter(0)
Run Code Online (Sandbox Code Playgroud)

在任一情况下:

>>> last(a_list)
'three'
>>> first(a_list)
'zero'
Run Code Online (Sandbox Code Playgroud)

特别案例

如果你正在做一些更复杂的事情,你可能会发现以更微不一样的方式获得最后一个元素会更有效.

如果您不熟悉编程,则应避免使用本节,因为它将语法上不同的算法部分耦合在一起.如果您在一个地方更改算法,则可能会对另一行代码产生意外影响.

我试着尽可能地提供警告和条件,但我可能错过了一些东西.如果您认为我要离开警告,请发表评论.

切片

列表的一个片段返回一个新列表 - 所以如果我们想要一个新列表中的元素,我们可以从-1切片到最后:

>>> a_slice = a_list[-1:]
>>> a_slice
['three']
Run Code Online (Sandbox Code Playgroud)

如果列表为空,这有好处不会失败:

>>> empty_list = []
>>> tail = empty_list[-1:]
>>> if tail:
...     do_something(tail)
Run Code Online (Sandbox Code Playgroud)

而尝试通过索引访问会引发IndexError需要处理的问题:

>>> empty_list[-1]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: list index out of range
Run Code Online (Sandbox Code Playgroud)

但同样,只有在您需要时才应该为此目的进行切片:

  • 创建了一个新列表
  • 如果先前列表为空,则新列表为空.

for 循环

作为Python的一个特性,for循环中没有内部作用域.

如果您已在列表上执行完整的迭代,则最后一个元素仍将由循环中指定的变量名称引用:

>>> def do_something(arg): pass
>>> for item in a_list:
...     do_something(item)
...     
>>> item
'three'
Run Code Online (Sandbox Code Playgroud)

这在语义上不是列表中的最后一件事.这在语义上是名称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'
Run Code Online (Sandbox Code Playgroud)

因此,这只应该用于获取最后一个元素

  • 已经循环,并且
  • 你知道循环将完成(不会因错误而中断或退出),否则它将指向循环引用的最后一个元素.

获取和删除它

我们还可以通过删除并返回最后一个元素来改变我们的原始列表:

>>> a_list.pop(-1)
'three'
>>> a_list
['zero', 'one', 'two']
Run Code Online (Sandbox Code Playgroud)

但现在修改了原始列表.

(-1实际上是默认参数,因此list.pop可以在没有索引参数的情况下使用):

>>> a_list.pop()
'two'
Run Code Online (Sandbox Code Playgroud)

只有这样才能做到

  • 你知道列表中有元素,或者如果它是空的,它准备处理异常,并且
  • 你打算从列表中删除最后一个元素,将其视为堆栈.

这些是有效的用例,但不是很常见.

保存其余的反向以供日后使用:

我不知道你为什么要这样做,但为了完整,因为reversed返回一个迭代器(它支持迭代器协议),你可以将其结果传递给next:

>>> next(reversed([1,2,3]))
3
Run Code Online (Sandbox Code Playgroud)

所以这就像反过来这样:

>>> next(iter([1,2,3]))
1
Run Code Online (Sandbox Code Playgroud)

但我想不出一个很好的理由去做,除非你以后需要其余的反向迭代器,这可能看起来更像这样:

reverse_iterator = reversed([1,2,3])
last_element = next(reverse_iterator)

use_later = list(reverse_iterator)
Run Code Online (Sandbox Code Playgroud)

现在:

>>> use_later
[2, 1]
>>> last_element
3
Run Code Online (Sandbox Code Playgroud)

  • 这个答案获得了我所见过的最长答案的奖励,并且具有很高的字数解决方案! (3认同)

Cry*_*ore 15

这是您查询的解决方案。

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.
Run Code Online (Sandbox Code Playgroud)

输出:

>>> first
>>> second
>>> last
>>> second from last
Run Code Online (Sandbox Code Playgroud)


pyl*_*ang 9

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'
Run Code Online (Sandbox Code Playgroud)


小智 8

some_list = [1,2,3]

方法1:

some_list.reverse() 
some_list[0]
Run Code Online (Sandbox Code Playgroud)

方法2:

some_list.reverse() 
some_list[0]
Run Code Online (Sandbox Code Playgroud)

方法3:

some_list.reverse() 
some_list[0]
Run Code Online (Sandbox Code Playgroud)


Val*_*tin 8

为了防止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'
Run Code Online (Sandbox Code Playgroud)


Son*_*ist 6

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

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

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

Yav*_*ter 6

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

next(reversed(some_list), None)
Run Code Online (Sandbox Code Playgroud)


U10*_*ard 6

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

>>> l = [1, 2, 3]
>>> *x, last_elem = l
>>> last_elem
3
>>> 
Run Code Online (Sandbox Code Playgroud)

只需打开包装即可。


Rad*_*ski 5

好的,但几乎每种语言都有共同点items[len(items) - 1]吗?这是IMO获取最后一个元素的最简单方法,因为它不需要任何pythonic知识.

  • 因为你正在编写Python,你真的应该尝试更多Pythonic (25认同)
  • @Pneumokok你明白了,但我认为列表索引是一种非常*基本的Python技术,而不是说生成器.另外,如果你不打算利用个人语言工具和语法,为什么还要使用除C之外的任何东西或javascript?然后,您可以在所有项目中始终如一地执行所有操作. (7认同)
  • @MichaelWu这样做没有任何意义.Pythonic方式通常不是不言自明的,需要更多的关注,你必须引入新的项目,当然,当你不得不切换到其他语言,如Java - 你不能使用Python特定的知识.当你尽可能省略pythonic方式时,那么在数月/年之后返回项目也会容易得多. (6认同)
  • items [len(items) - 1]本质上是Python在幕后所做的事情,但由于序列的len已存储在序列中,因此无需计算它,您创建的工作量超出了必要的范围. (4认同)

小智 5

在此输入图像描述

方法一:

L = [8, 23, 45, 12, 78]
print(L[len(L)-1])
Run Code Online (Sandbox Code Playgroud)

方法二:

L = [8, 23, 45, 12, 78]
print(L[-1])
Run Code Online (Sandbox Code Playgroud)

方法三:

L = [8, 23, 45, 12, 78]
L.reverse() 
print(L[0])
Run Code Online (Sandbox Code Playgroud)

方法四:

L = [8, 23, 45, 12, 78]
print(L[~0])
Run Code Online (Sandbox Code Playgroud)

方法5:

L = [8, 23, 45, 12, 78]
print(L.pop())
Run Code Online (Sandbox Code Playgroud)

全部输出78

  • ***** 解释得很好。***** (3认同)