如何获取列表的最后一个元素?
哪种方法更受欢迎?
alist[-1]
alist[len(alist) - 1]
some_list[-1]
是最短且最具Python风格的方法。
实际上,你可以用这种语法做更多的事情。 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]
会引发异常,因为空列表没有最后一个元素。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
所做的区分在于,返回一个空的列表对象或空的字符串对象比返回异常对象更像是最后一个元素。
if len(my_vector) == 0 or my_vector[-1] != update_val
是可行的模式。但这当然不是一个全局性的解决方案 - 如果有一个语法形式,其中None是结果,那就太好了。 - Mark Mullin你也可以这样做:
last_elem = alist.pop()
这取决于你想如何处理列表,因为 pop()
方法将删除最后一个元素。
显示 Python 中最后一个元素的最简单方法是:
>>> list[-1:] # returns indexed value
[3]
>>> list[-1] # returns value
3
有许多其他方法可以实现这样的目标,但这些方法简单又实用。
list[-1]
将会出错。 - anon01>>> 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
['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']
>>> 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
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'
False or 'default'
等于 'default'
。我本来以为它会被计算成 False or bool('default')
等于 True
。但是,自从什么时候 False or
和 True and
返回最右边的元素而不是将所有元素转换为布尔值呢?这是一个逻辑运算,却不能返回布尔值,有些不太直观。 - Guimoute这里是您查询的解决方案。
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.
输出:
>>> first
>>> second
>>> last
>>> second from last
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'
另一种方法:
some_list.reverse()
some_list[0]
O(1)
中执行相同的操作,但您也可以在O(n)
上执行。 - suryalist(reversed(reversed(reversed(reversed(some_list)))))[-1]
也可以工作,但这并不足以成为一个有效的答案。 - Guimoutelist[-1]
将检索列表的最后一个元素,而不更改列表。
list.pop()
将检索列表的最后一个元素,但它将改变原始列表。通常不建议更改原始列表。list [len(list)-1]
,假设列表不是空的。