如何在Python中获取列表的最后一项?

我需要列表中的最后9个数字,我相信有一种方法可以用切片来完成,但是我似乎无法得到它。 我可以得到这样的第一个9:

num_list[0:9] 

任何帮助将是伟大的。

你可以用切片运算符来使用负整数。 这里是一个使用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:]

一个负面的指数将从列表的末尾算起,所以:

 num_list[-9:] 

可以使用numlist [-9:]从左到右读取最后9个元素,或者使用numlist [: – 10:-1]从右到左读取最后9个元素。

 >>> 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] 

切片

Python切片是一个令人难以置信的快速操作,它是一个方便的方式来快速访问您的数据的一部分。

切片符号从列表(或任何其他支持它的序列,如string)中获取最后九个元素将如下所示:

 num_list[-9:] 

当我看到这个时候,我把括号内的这个部分看成是“从头到尾九点”。 (实际上,我把它缩写为“-9,on”)

说明:

完整的符号是

 sequence[start:stop:step] 

但冒号告诉Python你给它一个分片,而不是一个普通的索引。 这就是为什么在Python 2中复制列表的惯用方法是

 list_copy = sequence[:] 

清理它们是:

 del my_list[:] 

(在Python 3中列出获取list.copylist.clear

给你的切片一个描述性的名字!

您可能会发现分割形成切片以将其传递到list.__getitem__方法( 这就是方括号所做的 )是有用的。 即使你并不陌生,它也会使你的代码更具可读性,这样其他可能需要阅读代码的人才能更容易地理解你在做什么。

但是,您不能只将一些用冒号分隔的整数分配给一个variables。 您需要使用切片对象:

 last_nine_slice = slice(-9, None) 

第二个参数None是必需的,所以第一个参数被解释为start参数, 否则就是stop参数 。

然后,您可以将切片对象传递给您的序列:

 >>> list(range(100))[last_nine_slice] [91, 92, 93, 94, 95, 96, 97, 98, 99] 

islice

来自itertools模块的islice是另一种可能的performance方式。 islice不会带负面的参数,所以理想的情况是你的迭代器有一个__reversed__特殊的方法 – 哪个列表确实有 – 所以你必须先传递你的列表(或用__reversed__迭代)来reversed

 >>> from itertools import islice >>> islice(reversed(range(100)), 0, 9) <itertools.islice object at 0xffeb87fc> 

islice允许对数据stream水线进行惰性评估,从而实现数据,并将其传递给构造函数(如list ):

 >>> list(islice(reversed(range(100)), 0, 9)) [99, 98, 97, 96, 95, 94, 93, 92, 91] 

以下是获取迭代的“尾部”项目的几个选项:

鉴于:

 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)) 

说明

  • A.传统的Python 切片是语言固有的。 该选项适用于string,列表和元组等序列 。 但是,这种切片在迭代器上不起作用,例如iter(iterable)
  • B.一个itertools配方 。 这是普遍的工作任何迭代和解决最后的解决scheme中的迭代器问题。 这个配方必须手动实现,因为它没有正式包含在itertools模块中。
  • C.包括后一种工具(B)在内的许多食谱已经在第三方软件包中方便地实施了。 安装和导入这些库可以避免手动执行。 其中一个库叫做more_itertools (通过> pip install more-itertools ); 看more_itertools.tail
  • D. itertools库的成员。 请注意, itertools.islice 不支持负切片 。
  • E.另一个工具是在more_itertools中实现的,它推广了itertools.islice来支持more_itertools切片; 请参阅more_itertools.islice_extended

我使用哪一个?

这取决于 。 在大多数情况下,切片(选项A,如其他答案中提到的)是最简单的选项,因为它内置在语言中,并支持大多数迭代types。 对于更一般的迭代器,使用其余的选项。 请注意,选项C和E需要安装第三方库,有些用户可能会觉得有用。