如何在Python中反转列表的最后N个元素

9
假设我有一个列表:
>>> numbers = list(range(1, 15))

>>> numbers

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

我需要使用切片符号仅对最后10个元素进行反转

首先,我尝试只使用切片符号而不进行反转

>>> numbers[-10:]

[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

那么:

>>> numbers[-10::-1]

我期望得到 [14, 13, 12, 11, 10, 9, 8, 7, 6, 5]

但是实际得到的是 [5, 4, 3, 2, 1]

我可以这样解决这个问题:

numbers[-10:][::-1]

一切正常

[14, 13, 12, 11, 10, 9, 8, 7, 6, 5]

但我想知道为什么在我的情况下 numbers[-10::-1] 不起作用,如果有一种方法可以通过一个片段获得正确的结果。


1
你的示例有些奇怪,因为按照写法,numbers 包含了从1到14的整数,但不包括15。 - Hannes Ovrén
2个回答

12

有没有一种方法可以通过一个分片来得到正确的结果?

好的,你可以使用以下代码通过一个切片轻松地得到正确的结果:

numbers[:-11:-1]
# [14, 13, 12, 11, 10, 9, 8, 7, 6, 5]

为什么 numbers[-10::-1]不能按预期工作?

它按预期工作,可以在Explain Python's slice notation问题的答案中枚举所有切片可能性。请参见下面针对你的用例的期望行为(引用自我上面提到的答案):

seq[low::stride] =>>> # [seq[low], seq[low+stride], ..., seq[-1]]

4

这是您正在寻找的吗?

numbers = list(range(1, 15))
numbers[:-11:-1]
# [14, 13, 12, 11, 10, 9, 8, 7, 6, 5]

slice.indices的解释:

print(slice(None, -11, -1).indices(len(numbers)))
# (13, 3, -1)

意味着,这表示
numbers[:-11:-1] == numbers[13:3:-1]

在你的例子中,只切了9个元素,但我得到了numbers[:-10:-1],谢谢。 - Eugene Alkhouski
@EugeneAlkhouski:好的,已修复。你的示例不太一致,让我感到困惑... :) - hiro protagonist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接