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

How to get last items of a list in Python?

提问人:Nope 提问时间:3/15/2009 最后编辑:DharmanNope 更新时间:9/29/2022 访问量:621960

问:

我需要列表的最后 9 个数字,我确信有一种方法可以通过切片来做到这一点,但我似乎无法理解它。我可以像这样得到前 9 个:

num_list[0:9]
Python 列表 切片

评论

2赞 nekketsuuu 7/19/2018
相关新闻: 如何从列表中提取最后 x 个元素

答:

135赞 cobbal 3/15/2009 #1

负指数将从列表末尾开始计算,因此:

num_list[-9:]
743赞 winsmith 3/15/2009 #2

为此,您可以将负整数与切片运算符一起使用。下面是使用 python CLI 解释器的示例:

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

评论

29赞 nekketsuuu 7/19/2018
请注意,这是 .所以返回整个,而不是最后的零个元素。要保护零,您可以使用 .-00a[-0:]a[]a[-n:] if n > 0 else []
47赞 Nikwin 3/15/2009 #3

最后 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]
105赞 Russia Must Remove Putin 7/8/2014 #4

切片

Python 切片是一项非常快速的操作,它是快速访问部分数据的便捷方法。

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

num_list[-9:]

当我看到这个时,我把括号里的部分读作“从最后到最后的第 9 个”。(实际上,我在心理上将其缩写为“-9,on”)

解释:

完整的符号是

sequence[start:stop:step]

但是冒号是告诉 Python 你给它一个切片而不是一个常规索引。这就是为什么在 Python 2 中复制列表的惯用方式是

list_copy = sequence[:]

清除它们是:

del my_list[:]

(在 Python 3 中列出 get 和 。list.copylist.clear

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

您可能会发现将形成切片与将其传递给方法分开很有用(这就是方括号的作用)。即使你不熟悉它,它也能使你的代码更具可读性,以便可能需要阅读你的代码的其他人可以更容易地理解你在做什么。list.__getitem__

但是,您不能只将一些用冒号分隔的整数分配给变量。您需要使用 slice 对象:

last_nine_slice = slice(-9, None)

第二个参数 是必需的,因此第一个参数被解释为参数,否则它将是停止参数Nonestart

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

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

islice

islice从 IterTools 模块中获取此功能是另一种可能的高性能方法。 不接受否定参数,所以理想情况下,你的可迭代对象有一个特殊的方法 - 列表确实有 - 所以你必须首先将你的列表(或可迭代对象)传递给 。islice__reversed____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赞 Swanky Coder 10/21/2018
你的心理缩写很有帮助
11赞 pylang 8/23/2017 #5

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

鉴于

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 切片是该语言固有的。此选项适用于字符串、列表和元组等序列。但是,这种切片不适用于迭代器,例如 .iter(iterable)
  • B.itertools 配方。它被推广到任何可迭代对象上,并在最后一个解决方案中解决了迭代器问题。此配方必须手动实现,因为它未正式包含在模块中。itertools
  • C. 许多配方,包括后一个工具(B),已经方便地在第三方软件包中实现。安装和导入这些库可避免手动实现。其中一个库称为 (install via );请参阅 more_itertools.tailmore_itertools> pip install more-itertools
  • D. 图书馆成员。注意,不支持负切片itertoolsitertools.islice
  • E.实现了另一个工具,该工具泛化以支持负切片;请参阅 more_itertools.islice_extendedmore_itertoolsitertools.islice

我应该使用哪一个?

这要视情况而定。在大多数情况下,切片(选项 A,如其他答案中提到的)是最简单的选项,因为它内置于语言中并支持大多数可迭代类型。对于更通用的迭代器,请使用其余任何选项。请注意,选项 C 和 E 需要安装第三方库,某些用户可能会发现这很有用。