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

时间:2009-03-14 20:19:45

标签: python list slice

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

num_list[0:9]

任何帮助都会很棒。

5 个答案:

答案 0 :(得分:391)

您可以对切片运算符使用负整数。以下是使用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 :(得分:81)

否定索引将从列表末尾开始计算,因此:

num_list[-9:]

答案 2 :(得分:41)

切片

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

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

num_list[-9:]

当我看到这个时,我将括号中的部分从结尾读到第9页,直到最后。" (实际上,我在精神上将其缩写为" -9,在")

说明:

完整的符号是

sequence[start:stop:step]

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

list_copy = sequence[:]

清除它们是:

del my_list[:]

(列表在Python 3中获得list.copylist.clear。)

为您的切片提供一个描述性名称!

您可能会发现将切片与将其传递给list.__getitem__方法(that's what the square brackets do)分开是很有用的。即使您不是新手,它也会让您的代码更具可读性,以便其他可能需要阅读您的代码的人可以更轻松地了解您正在做的事情。

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

last_nine_slice = slice(-9, None)

第二个参数None是必需的,因此第一个参数被解释为start参数otherwise it would be the stop argument

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

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

islice

来自itertools模块的

islice是获得此功能的另一种可能的高效方法。 islice没有采取否定参数,因此理想情况下,您的iterable具有__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 :(得分:38)

可以使用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 :(得分:3)

以下是获得&#34; tail&#34;的几个选项。可迭代的项目:

<强>鉴于

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 slicing是该语言所固有的。此选项适用于sequences,例如字符串,列表和元组。但是,这种切片在iterators上不起作用,例如iter(iterable)
  • B中。一个itertools recipe。它被推广到可以在任何iterable上工作并解决上一个解决方案中的迭代器问题。此配方必须手动实施,因为它未正式包含在itertools模块中。
  • ℃。许多配方,包括后一种工具(B),已经方便地在第三方包装中实施。安装和导入这些库可以避免手动实现。其中一个库称为more_itertools(通过> pip install more-itertools安装);见more_itertools.tail
  • d。 itertools库的成员。请注意,itertools.islice does not support negative slicing
  • 电子。另一个工具在more_itertools中实现,它概括了itertools.islice以支持负切片;见more_itertools.islice_extended

我使用哪一个?

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