问题:如何在Python中获取列表的最后一项?
我需要列表的最后9个数字,而且我敢肯定有一种切片方法,但是我似乎无法理解。我可以这样获得前9个:
num_list[0:9]
回答 0
您可以在切片运算符中使用负整数。这是使用python CLI解释器的示例:
>>> a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
>>> a[-9:]
[4, 5, 6, 7, 8, 9, 10, 11, 12]
重要的是 a[-9:]
回答 1
负索引将从列表的末尾开始计数,因此:
num_list[-9:]
回答 2
切片
Python切片是一项非常快的操作,它是一种快速访问部分数据的便捷方法。
从列表(或支持字符串的任何其他序列,如字符串)中获取最后九个元素的切片表示法如下所示:
num_list[-9:]
看到此内容时,我将括号中的部分读为“从末尾到第9位”。(实际上,我在心理上将其缩写为“ -9,on”)
说明:
完整的符号是
sequence[start:stop:step]
但是冒号是告诉Python您给它一个切片而不是常规索引的原因。这就是为什么在Python 2中复制列表的惯用方式是
list_copy = sequence[:]
清除它们的方法是:
del my_list[:]
(清单get list.copy
和list.clear
in Python3。)
给您的切片起一个描述性的名字!
您可能会发现,将形成切片与将切片传递给list.__getitem__
方法分开很有用(这就是方括号所做的事情)。即使您并不陌生,它也可以使您的代码更具可读性,以便其他可能需要阅读您的代码的人可以更轻松地了解您的操作。
但是,您不能仅将一些用冒号分隔的整数分配给变量。您需要使用slice对象:
last_nine_slice = slice(-9, None)
第二个参数,None
,是必需的,使得第一参数被解释为所述start
参数否则这将是stop
自变量。
然后可以将slice对象传递给序列:
>>> list(range(100))[last_nine_slice]
[91, 92, 93, 94, 95, 96, 97, 98, 99]
islice
islice
从itertools模块中获取是另一种可能的有效方法。islice
不会接受否定参数,因此理想情况下,您的iterable具有一个__reversed__
特殊的方法-列表确实具有-因此您必须先将您的列表(或with的iterable __reversed__
)传递给reversed
。
>>> from itertools import islice
>>> islice(reversed(range(100)), 0, 9)
<itertools.islice object at 0xffeb87fc>
islice允许对数据管道进行延迟评估,因此要实现数据,请将其传递给构造函数(如list
):
>>> list(islice(reversed(range(100)), 0, 9))
[99, 98, 97, 96, 95, 94, 93, 92, 91]
回答 3
您可以根据需要使用numlist [-9:]从左到右读取最后9个元素,或者使用numlist [:-10:-1]从右到左读取。
>>> a=range(17)
>>> print a
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[-9:]
[8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> print a[:-10:-1]
[16, 15, 14, 13, 12, 11, 10, 9, 8]
回答 4
这是获取迭代的“ tail”项的几个选项:
给定
n = 9
iterable = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
期望的输出
[2, 3, 4, 5, 6, 7, 8, 9, 10]
码
我们使用以下任一选项获取后者的输出:
from collections import deque
import itertools
import more_itertools
# A: Slicing
iterable[-n:]
# B: Implement an itertools recipe
def tail(n, iterable):
"""Return an iterator over the last *n* items of *iterable*.
>>> t = tail(3, 'ABCDEFG')
>>> list(t)
['E', 'F', 'G']
"""
return iter(deque(iterable, maxlen=n))
list(tail(n, iterable))
# C: Use an implemented recipe, via more_itertools
list(more_itertools.tail(n, iterable))
# D: islice, via itertools
list(itertools.islice(iterable, len(iterable)-n, None))
# E: Negative islice, via more_itertools
list(more_itertools.islice_extended(iterable, -n, None))
细节
- 答:传统的Python 切片是该语言固有的功能。此选项适用于序列,例如字符串,列表和元组。但是,这种切片不适用于迭代器,例如
iter(iterable)
。 - B.
。它可以普遍适用于任何可迭代的对象,并且可以解决最后一个解决方案中的迭代器问题。此配方必须手动实现,因为它尚未正式包含在 itertools
模块中。 - C.许多配方,包括后一种工具(B),都已在第三方软件包中方便地实现。安装和导入这些库可以避免手动实施。这些库之一称为
more_itertools
(通过安装> pip install more-itertools
);见more_itertools.tail
。 - D.
itertools
图书馆的成员。注意,itertools.islice
不支持负片。 - E.实现了另一种工具,
more_itertools
该工具可以概括itertools.islice
为支持负切片;见more_itertools.islice_extended
。
我要使用哪一个?
这要看情况。在大多数情况下,切片(如其他答案中所述的选项A)是语言中最简单的选项,并且支持大多数可迭代类型。对于更通用的迭代器,请使用其余任何选项。请注意,选项C和E需要安装第三方库,某些用户可能会觉得有用。