赞
踩
在Python中,如何获取列表的最后一个元素?
在python中显示最后一个元素的最简单方法是
- >>> list[-1:] # returns indexed value
- [3]
- >>> list[-1] # returns value
- 3
还有许多其他方法可以实现这一目标,但这些方法简短易用。
好的,但是几乎在每种语言方式中,通用items[len(items) - 1]
呢? 这是IMO获得最后一个元素的最简单方法,因为它不需要任何Python知识。
另一种方法:
- some_list.reverse()
- some_list[0]
list[-1]
将检索list[-1]
的最后一个元素,而不更改列表。 list.pop()
将检索列表的最后一个元素,但它将更改/更改原始列表。 通常,不建议更改原始列表。
另外,如果出于某种原因,您正在寻找一些不符合pythonic的工具,则可以使用list[len(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对象更像是“异常元素”,而不是异常对象。
如果不想在列表为空时获取IndexError,也可以使用下面的代码。
next(reversed(some_list), None)
在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'
以下是如果列表为空时不需要IndexError的代码。 next(reversed(some_list), None)
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]
将引发异常,因为空列表不能包含最后一个元素。
您也可以这样做:
alist.pop()
这取决于您要对列表执行的操作,因为pop()
方法将删除最后一个元素。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。