我需要列表的最后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:]
Python切片是一种非常快速的操作,它是快速访问部分数据的便捷方式.
从列表中获取最后九个元素的切片表示法(或任何其他支持它的序列,如字符串)将如下所示:
num_list[-9:]
当我看到这个时,我将括号中的部分读作"从结尾到结尾的第9个".(实际上,我在精神上将其缩写为"-9,on")
完整的符号是
sequence[start:stop:step]
但冒号告诉Python你给它一个切片而不是常规索引.这就是为什么在Python 2中复制列表的惯用方法是
list_copy = sequence[:]
清除它们是:
del my_list[:]
(列表得到list.copy
并list.clear
在Python 3中.)
您可能会发现将切片与将其传递给list.__getitem__
方法(这就是方括号的作用)分开很有用.即使您不是新手,它也会使您的代码更具可读性,以便其他可能必须阅读您的代码的人可以更容易地理解您正在做的事情.
但是,您不能只将由冒号分隔的整数分配给变量.您需要使用切片对象:
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
islice
来自itertools模块是获得此功能的另一种可行的方法.islice
不带负参数,所以理想情况下你的iterable有一个__reversed__
特殊的方法 - 列表确实有 - 所以你必须首先传递你的列表(或迭代__reversed__
)reversed
.
>>> from itertools import islice >>> islice(reversed(range(100)), 0, 9)
islice允许对数据管道进行惰性求值,因此要实现数据,将其传递给构造函数(如list
):
>>> list(islice(reversed(range(100)), 0, 9)) [99, 98, 97, 96, 95, 94, 93, 92, 91]
最后9个元素可以使用numlist [-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]
这是获取可迭代的“ 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
食谱。它可以普遍适用于任何可迭代的对象,并可以解决最后一个解决方案中的迭代器问题。此配方必须手动实现,因为它尚未正式包含在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需要安装第三方库,某些用户可能会觉得有用。