如何允许第一个元素包含在反向切片中?

How to allow the first element to be included in a reverse slice?

我正在尝试弄清楚如何定义能够返回第一个元素的 slice

>>> x = list(range(100))
>>> s = slice(91, 100, 2)
>>> x[s] 
[91, 93, 95, 97, 99]  # Highest works fine.

>>> s = slice(10, -1, -2)
>>> x[s]
[]  # Nope

>>> s = slice(10, 0, -2)
>>> x[s]
[10, 8, 6, 4, 2]  # No zero

>>> 0 in x
True

你必须在这里使用 None。您想要 x[10::-2] 等效切片为:

s = slice(10, None, -2)
x[s]
# [10, 8, 6, 4, 2, 0]

阅读此答案以充分理解 Python 中的切片是如何工作的:Understanding slice notation


让我们说 slice(start, stop, step) 来解释为什么你的其他示例不起作用

  • s = slice(10, 0, -2) 不包括 0 即第一个元素,因为在切片中我们采用直到 stop - 1.
  • slice(10, -1, -2) 在使用负值切片时以不同的方式工作。负值表示从列表后面开始的值。因此,上面的切片将是 slice(10, len(x)-1, -2).
  • s = slice(91, 100, 2) 起作用是因为 99 的索引是 99(x.index(99) -> 99) 而不是 10099 低于 100 因此包含在内。
  • slice(91, 9999, 2) 会给出 [91, 93, 95, 97, 99],因为大于 len(x) 的值将被替换为 len(x)。更多相关信息 Why does substring slicing with index out of range work?