如何获取列表的最后一个元素?

问:

如何获取列表的最后一个元素?

答1:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

答2:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

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

投反对票是因为我觉得这个答案的核心是不正确的。当你想要一个元素时获取一个列表只会推迟不可避免的“列表索引超出范围”——这就是尝试从空列表中获取元素时应该发生的情况。对于字符串 astr[-1:] 可能是一种有效的方法,因为它返回与 asr[-1] 相同的类型,但我不认为 ':' 有助于处理空列表(问题是关于列表) .如果想法是使用“alist[-1:]”作为条件而不是“len(alist) > 0”,我认为使用后者更具可读性。 (如果我错过了什么,很高兴投票)

你的反对票是可以理解和有效的。但是,我发现关于异常对象的用途有两个基本阵营。可以肯定的是,异常会停止您的应用程序。一个阵营在 try 子句中使用异常,因为另一个阵营将使用 if len(alist)>0: 结构。无论如何,异常是停止您的代码的对象。因此,对我而言,序列对象较少,例如返回的“null”序列,它们不会停止您的代码。我的偏好是使用 IF 子句来测试“空”对象,而不是使用 try 子句抢占我的代码的对象。

赞成是因为切片语法值得讨论,但是我同意@StanKurdziel 的观点,即形态错误,您只是在移动球门柱-我发现我自己的解决方案与“如果您没有,请将其添加到列表中”的主要用途有关“尚未添加”(增量线图),因此组合表达式 if len(my_vector) == 0 or my_vector[-1] != update_val 是一种可行的模式。但这肯定不是一个全局解决方案 - 如果有一个语法形式,其中 None 是结果会很好

xs[-1] if xs else None

为什么要“避免” IndexError?如果你试图索引一个空列表或字符串,你会得到一个异常。如果您想处理该异常,请使用 try/except ——这就是它的用途。

答3:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

你也可以这样做:

last_elem = alist.pop()

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

注意:值得知道这也会从列表中删除最后一个元素。

答4:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

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

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

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

如果您的列表长度为零,则此解决方案有效,而 list[-1] 将出错。

答5:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

在 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 有一个像 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 "", 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

这个答案获得了我见过的最长答案的奖励,它是一个高字率解决方案!

答6:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

要防止 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:

与HuntsBot一起,探索全球自由职业机会–huntsbot.com

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:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

另一种方法:

some_list.reverse() 
some_list[0]

这是一种简单的方法,您也可以在 O(n) 上执行相同的操作,即使您可以选择在 O(1) 中执行。

答9:

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

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

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

假设通常不建议对原始列表进行变异可能是不好的,因为毕竟它很常见

答10:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

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

next(reversed(some_list), None)

答11:

huntsbot.com – 高效赚钱,自由工作

好的,但是几乎所有语言的通用方式items[len(items) – 1]呢?这是 IMO 获取最后一个元素的最简单方法,因为它不需要任何 pythonic 知识。

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

既然你在写 Python,你真的应该尝试更 Pythonic

@MichaelWu 这样做是没有意义的。 Pythonic 方式通常不是不言自明的,需要更多注意您必须向项目介绍新人的地方,当然,当您必须切换到 Java 等其他语言时,它就行不通了——您不能使用 Python 特定的知识。当您尽可能省略 pythonic 方式时,几个月/几年后返回项目也容易得多。

@Pneumokok 你说得有道理,但我认为与生成器相比,列表索引是一种非常基本的 Python 技术。此外,如果您不打算利用单独的语言工具和语法,为什么还要费心使用 C 或 javascript 以外的任何东西呢?然后,您可以在所有项目中始终如一地以艰难的方式完成所有工作。

虽然它不是很 Pythonic,但我认为这在某些方面比 some_list[-1] 方法更好,因为它更合乎逻辑,并且在我看来它实际上比 some_list[-1] 做得更好。

原文链接:https://www.huntsbot.com/qa/kaME/how-do-i-get-the-last-element-of-a-list?lang=zh_CN&from=csdn

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

物联沃分享整理
物联沃-IOTWORD物联网 » 如何获取列表的最后一个元素?

发表评论